您的位置:首页 > 编程语言 > Java开发

【常用排序算法】归并排序(Java实现)

2017-11-17 12:52 471 查看
递归算法实现:

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;
这段是防止超出数组最大序列

如果您有更好的解法,欢迎您在留言区补充,感谢!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐