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

归并排序 Java实现(递归试)

2018-03-18 13:11 274 查看
归并排序: 将两个有序的序列合并成一个有序的序列,相当于手中有两副已经排好序并且每副单独叠到一起的牌,一次判断大小,再重新放到一个新的位置并排好序
对于一副混乱的牌而言,可以将牌分成两两一组,再依次合并排序,归并排序算法复杂度 纵向递归深度log(n) 横向比较次数为c*n,复杂度为O(n*log(n))

public class MergeQuene {

static public int[] mergeQuene(int[] number,int leftEdge,int rightEdge){
int middle = (leftEdge+rightEdge)/2;
if(rightEdge>leftEdge){
//递归调用
mergeQuene(number,leftEdge,middle);
mergeQuene(number,middle+1,rightEdge);
mergeAlgo(number, leftEdge, rightEdge);
}
return number;
}

static private int[] mergeAlgo(int[] arr,int leftEdge,int rightEdge){
//加取余的原因: 在排序数非偶数个时,由于左边两个已经排序完成,需要在分组时放到相同的序列中
int leftNum=(rightEdge-leftEdge+1)/2+(rightEdge-leftEdge+1)%2;
int rightNum=rightEdge-leftEdge+1-leftNum;

//左右两个数组赋值
int[] leftArr = new int[leftNum];
int[] rightArr = new int[rightNum];
for(int i=0;i<leftNum;i++){
leftArr[i]=arr[i+leftEdge-1];
}
for(int j=0;j<rightNum;j++){
rightArr[j]=arr[j+rightEdge-rightNum];
}
//对左右两个数组进行归并排序,对于其中一组数据用完,则第二组直接赋值
int m=0,n=0;
for(int i=0;i<leftNum+rightNum;i++){
if(leftArr[m]<rightArr
){
arr[i+leftEdge-1]=leftArr[m];
m++;
if(m>=leftNum){
for(;i<leftNum+rightNum-1;i++){
arr[i+leftEdge]=rightArr
;
n++;
}
return arr;
}

}else{
arr[i+leftEdge-1]=rightArr
;
n++;
if(n>=rightNum){
for(;i<leftNum+rightNum-1;i++){
arr[i+leftEdge]=leftArr[m];
m++;
}
return arr;
}
}
}
printArr(arr);
return arr;
}

public static void printArr(int[] arr){
for(int i=0;i<arr.length;i++){
System.out.println("quene arr  "+arr[i]);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息