【排序算法】(4)归并排序

归并排序


2019-11-10  11:41:59  by冲冲

1、概念

归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略。

分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之。

2、基本思想

归并排序采用递归实现(也可以采用迭代的方式实现)。分阶段就是递归拆分子序列的过程,递归深度为log2n。

合并相邻有序子序列

治阶段就是将两个已经有序的子序列合并成一个有序序列,比如最后一次合并,要将[4,5,7,8]和[1,2,3,6]两个已经有序的子序列,合并为最终序列[1,2,3,4,5,6,7,8],来看下实现步骤。

3、完整代码

 1 public class MergeSort {
 2     public static void main(String []args){
 3         int i;
 4         int []a = {9,8,7,6,5,4,3,2,1};
 5 
 6         System.out.printf("before sort:");
 7         for (i=0; i<a.length; i++){
 8             System.out.printf("%d ", a[i]);
 9         }
10         System.out.printf("
");
11 
12         mergeSort(a);
13 
14         System.out.printf("after  sort:");
15         for (i=0; i<a.length; i++){
16             System.out.printf("%d ", a[i]);
17         }
18         System.out.printf("
");
19     }
20 
21     public static void mergeSort(int []arr){
22         int []temp = new int[arr.length];
23         //在排序前,先建好一个长度等于原数组长度的临时数组,
24         //避免递归中频繁开辟空间
25         mergeSort(arr,0,arr.length-1,temp);
26     }
27 
28     private static void mergeSort(int[] arr,int left,int right,int []temp){
29         if(left<right){
30             int mid = (left+right)/2;
31             mergeSort(arr,left,mid,temp);
32             //左边归并排序,使得左子序列有序
33             mergeSort(arr,mid+1,right,temp);
34             //右边归并排序,使得右子序列有序
35             merge(arr,left,mid,right,temp);
36             //将两个有序子数组合并操作
37         }
38     }
39     
40     private static void merge(int[] arr,int left,int mid,int right,int[] temp){
41         int i = left;//左序列指针
42         int j = mid+1;//右序列指针
43         int t = 0;//临时数组指针
44         while (i<=mid && j<=right){
45             if(arr[i]<=arr[j]){
46                 temp[t++] = arr[i++];
47             }else {
48                 temp[t++] = arr[j++];
49             }
50         }
51         while(i<=mid){//将左边剩余元素填充进temp中
52             temp[t++] = arr[i++];
53         }
54         while(j<=right){//将右序列剩余元素填充进temp中
55             temp[t++] = arr[j++];
56         }
57         t = 0;
58         //将temp中的元素全部拷贝到原数组中
59         while(left <= right){
60             arr[left++] = temp[t++];
61         }
62     }
63 }
before sort:  9 8 7 6 5 4 3 2 1 
after  sort:  1 2 3 4 5 6 7 8 9 
原文地址:https://www.cnblogs.com/yadiel-cc/p/11829394.html