排序算法之归并排序

Love The Way You Lie 2022-04-16 05:08 341阅读 0赞

归并排序(MERGE-SORT)
建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。

算法描述
归并操作的工作原理如下:
第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
第二步:设定两个指针,最初位置分别为两个已经排序序列的起始位置
第三步:比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
重复步骤3直到某一指针超出序列尾
将另一序列剩下的所有元素直接复制到合并序列尾

代码实现:

  1. package com.study.heap;
  2. import java.util.Arrays;
  3. /**
  4. * @Title: MergeSort
  5. * @Description:
  6. * @author: youqing
  7. * @version: 1.0
  8. * @date: 2018/11/17 11:07
  9. */
  10. public class MergeSort {
  11. public static void main(String []args){
  12. int []arr = {9,5,4,1,3,7,8,2,6};
  13. sort(arr);
  14. System.out.println(Arrays.toString(arr));
  15. }
  16. public static void sort(int []arr){
  17. int []temp = new int[arr.length];//在排序前,先建好一个长度等于原数组长度的临时数组,避免递归中频繁开辟空间
  18. sort(arr,0,arr.length-1,temp);
  19. }
  20. private static void sort(int []arr,int left,int right,int []temp){
  21. if(left < right){
  22. int mid = (left + right)/2;
  23. sort(arr,left,mid,temp);//左边归并排序,使得左子序列有序
  24. sort(arr,mid+1,right,temp);//右边归并排序,使得右子序列有序
  25. merge(arr,left,mid,right,temp);//将两个有序子数组合并操作
  26. }
  27. }
  28. private static void merge(int []arr,int left,int mid,int right,int []temp){
  29. int i = left;//左序列指针
  30. int j = mid+1;//右序列指针
  31. int t = 0;//临时数组指针
  32. while (i <= mid && j<= right){
  33. if(arr[i]<arr[j]){
  34. temp[t++] = arr[i++];
  35. }else{
  36. temp[t++] = arr[j++];
  37. }
  38. }
  39. while (i <= mid){//将左边剩余元素填充进temp中
  40. temp[t++] = arr[i++];
  41. }
  42. while (j <= right){//将右序列剩余元素填充进temp中
  43. temp[t++] = arr[j++];
  44. }
  45. t = 0;
  46. //将temp中的元素全部拷贝到原数组中
  47. while (left <= right){
  48. arr[left++] = temp[t++];
  49. }
  50. }
  51. }

发表评论

表情:
评论列表 (有 0 条评论,341人围观)

还没有评论,来说两句吧...

相关阅读

    相关 排序算法归并排序

    归并排序是一种基于分治思想的排序算法,它的基本思路是将原始序列划分为若干个子序列,对每个子序列进行排序,然后将排好序的子序列合并为一个大序列,最终得到排序结果。具体来说,归并排

    相关 排序算法归并排序

    归并排序 基本思想:归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使用每个子序列有

    相关 排序算法归并排序

    归并排序> 之前曾经实现过堆排序,它用到了完全二叉树,但是堆的设计本身就是比较复杂的,而今天要实现的归并排序同样的也用到了完全二叉树的思想,这种思想比堆排序较为简单.

    相关 排序算法归并排序

    归并排序是利用递归与分治思想将数据序列划分成越来越小的半子序列,在对其进行排序,最后利用递归将排好序的半子序列合并成越来越大的有序序列。 归并排序中,归 即是递归的意思,即递