归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
听说这种方法比较牛逼,所以去查了一下原理,然后自己写的代码:
先用到一个方法将需要排序的数组进行分割,再有序合并,如果分割的部分有序,合并时会很简单,所以再对分割的部分用同样的方法,为了易于阅读,将边合并边排序的方法分开写
public static void separate(int a[],int start,int end) {
if(start>=end)return;
int half=(start+end)/2;
separate(a,start,half);
separate(a,half+1,end);
merge(a,start,half+1,end);
}
public static void merge(int a[],int start,int half,int end) {
int mid=half;
int s=start;
int b[]=new int[end-start+1];
int x=0;
while(start<mid&&half<=end) {
if(a[start]<a[half]) {
b[x++]=a[start++];
}else {
b[x++]=a[half++];
}
}
while(start<mid) {
b[x++]=a[start++];
}
while(half<=end) {
b[x++]=a[half++];
}
for(int i=0;i<x;i++) {
a[s++]=b[i];
}
}
虽然这个排序方法比较快,但我觉得递归太耗内存了