归并排序实现以及空间优化
自顶向下的归并排序
public void mergeSortTop2Bottom(int[]a,int start,int end,int[]aux){
if(start>=end) return;
int mid = (start+end)/2;
mergeSortTop2Bottom(a,start,mid,aux);
mergeSortTop2Bottom(a,mid+1,end,aux);
merge(a,start,mid+1,end);
}
private void merge(int[]a, int start,int mid,int end,int[] aux) {
for(int i=start;i<=end;i++){
aux[i] = a[i];
}
int i = start,j=mid;
int k = start;
while(i<mid && j<=end){
if(a[i]<a[j]){
a[k++] = aux[i++];
}else{
a[k++] = aux[j++];
}
}
while(i<mid) {
a[k++] = aux[i++];
}
while(j<=end){
a[k++] = aux[j++];
}
}
自低向上的归并排序
public void mergeSortBottom2Top(int[]a,int[]aux) {
for(int size = 1; size< a.length; size*=2){
for(int i=0;i<=a.length-size;i++){
merge(a,i,i+size-1,Math.min(i+size*2-1,a.length-1),aux);
}
}
}
merge 空间的优化
private void merge(int[]a,int start,int mid,int end){
int i = start,j=mid,k,key;
while(i<mid && j<=end){
if(a[i]<a[j]){
i++;
}else{
key = a[j];
for(k=j;k>i;k--){
a[k] = a[k-1];
}
a[i++] = key;
j++;
mid++;
}
}
}