递归算法实现:
public static void mergeSort(int[] A,int left,int right) {
if(left==right)
return;
int mid=(left+right)/2;
mergeSort(A,left,mid);
mergeSort(A,mid+1,right);
merge(A,left,mid,right);
}
public static void merge(int[] A,int left, int mid,int right ){
int[] temp=new int[right-left+1];
int index=0;
int midNext=mid+1;
while(left<=mid&&midNext<=right){
if(A[left]>A[midNext]){
temp[index++]=A[midNext++];
}else{
temp[index++]=A[left++];
}
}
while(left<=mid){
temp[index++]=A[left++];
}
while(midNext<=right){
temp[index++]=A[midNext++];
}
for(int i=temp.length-1;i>=0;){
A[right--]=temp[i--];
}
}
非递归实现:
public static void mergeSort(int[] A) {
int length=A.length;
int left,mid,right;
for(int i=1;i<length;i=i*2){
left=0;
while(left+i<length){
mid=left+i-1;
right=mid+i<length?mid+i:length-1;
merge(A,left,mid,right);
left=right+1;
}
}
}
//merge()同上
非递归实现其实就参考递归算法中,递归至最底层时过程的模拟。
外层for循环 i=1时 ,其实就是 [1][2] [3][4] [5][6] [7][8] 进行比较合并
外层for循环 i=2时 ,其实就是 [1,2] [3,4] [5,6] [7,8] 进行比较合并
………
right=mid+i<length?mid+i:length-1;
这段是防止超出数组最大序列
如果您有更好的解法,欢迎您在留言区补充,感谢!!