自定向下
左闭右闭
左边递归,右边递归
再根据左边,右边(进行合并排序)
代码如下
这里面相比传统的归并有一个优化那就是当数组分到一定数量的时候,就可以进行插入排序,来提高效率,还有就是
当左边本来就小于等于右边的时候就不需要就行归并啦
//归并排序自定向下
public static void mergeSort(int[] arr,int n){
__mergeSort(arr,0,n-1);
}
public static void __mergeSort(int[] arr,int left,int right) {
if(left>=right) {
return ;
}
// if(right-left<=15) {
// sort.improveInsertionSort(arr,left,right);
// return;
// }
int mid = (left+right)/2;
__mergeSort(arr,left,mid);
__mergeSort(arr,mid+1,right);
if(arr[mid]>arr[mid+1])
__merge(arr,left,mid,right);
}
public static void __merge(int[] arr, int left, int mid, int right) {
int [] aux = new int [right-left+1];
for(int i=left;i<=right;i++) {
aux[i-left]=arr[i];
}
int i =left,j=mid+1;
for(int k =left;k<=right;k++) {
if(i>mid) {
arr[k]=aux[j-left];
j++;
}
else if(j>right){
arr[k]=aux[i-left];
i++;
}
else if(aux[i-left]<aux[j-left]) {
arr[k]=aux[i-left];
i++;
}
else {
arr[k]=aux[j-left];
j++;
}
}
}
自定向上的方法的实现其实原理和自顶向下都是一样的只是这个是用迭代是实现,相信大家看了代码都能懂就不再多BB啦
public static int min(int a,int b) {
if(a>b)
return b;
else return a;
}
public static void mergeSortBU(int[] arr,int n){
for(int sz=1;sz<n;sz+=sz) {
for(int i=0;i+sz<n;i+=sz+sz) {
__merge(arr,i,i+sz-1,min(i+sz+sz-1,n-1));
}
}
}