一:什么是归并排序
对一个数组进行排序,可以递归的将其分成两半分别进行排序,带有序之后,再将二者进行合并(两个有序数组的合并)。
使用递归,将数组依次进行分组,直至分到一个元素一组,然后进行归并,两两归并,四四归并,直到完全归并,在归并的过程中,待归并的两个子数组 组内元素有序(相当于将两个有序的数组进行合并)。
二:代码实现
public class Merge { private static int[] a ={20,45,2,1,43,3,91,2,65,19,30,1,47,89,56,11}; private static int[] aux; /**归并过程中的辅助数据*/ public static void main(String args[]){ aux = new int[a.length]; Mergesort(a,0,a.length-1); show(a); } private static void Mergesort(int[] a, int m, int n) { if(n<=m) return; int mid = m +(n-m)/2; Mergesort(a,m,mid); Mergesort(a,mid+1,n); merge(a,m,mid,n); } private static void show(int[] aux) { System.out.println("排序结果为"); for(int i=0;i<aux.length;i++){ System.out.print(aux[i]+","); } } /**合并 本质上就是两个有序数组进行合并*/ private static void merge(int[] a, int m, int mid, int n) { int i=m; int j=mid+1; for(int k=i;k<=n;k++){ aux[k] = a[k]; //将待归并的数据放置到辅助数据中 } for(int k =m;k<=n;k++){ if(i>mid) a[k] = aux[j++]; //左边已经归并完 else if(j>n) a[k] =aux[i++];//右边已经归并完 else if(less(aux[i],aux[j])) a[k] = aux[i++]; else a[k] = aux[j++]; } } private static boolean less(int i, int j) { if(i<j){ return true; } else { return false; } } }
我们可以使用归并排序算法处理数组规模较大的情况,可以处理数百万甚至更大的数组规模。缺点是辅助数组所使用的额外空间和N的大小成正比。