归并算法
归并算法采用了分而治之的思想,具体的内容懂的都懂,不懂的也不需要明白,看代码就完事了。
公共类桂兵{
public static int[]arr=new int[]{ 8,6,4,7,3,2,5,1 };
公共静态int[]guibing(int[]arr){ 0
//先定义最开始的最左下标和最右下标0和右侧七
int left=0;
int right=arr。长度-1;
int[] narr=sort(arr,左,右);
返回纳尔
}
私有静态int[]排序(int[] arr,int left,int right){ 0
//递归分治,将序列按照左右划分为一个个子序列,最小子序列长度为1,这时左下标等于右下标
//左节点
如果(左==右){ 0
//当分到不能再分时,进行合并,返回一个最小的数组为1,
//这种方法将会创建n n/2 n/4 n/8个数组,非常耗费资源,不推荐使用,但是容易理解
//可以进行优化,直接创建尺寸/2大小的临时数组进行储存即可
返回新的int[]{ arr[left]};
}
int l1=左侧;
int r1=(右左-1)/2;
int L2=R1 1;
int r2=右;
//递归分治,将会使左右的下标都被标记到
int[] arrleft=sort(arr,l1,R1);
int[] arrright=sort(arr,l2,R2);
返回mergn(arrleft,arr right);
}
私有静态int[] mergn(int[] arrleft,int[]arr right){ 0
//合并,使用双指针法进行合并,左小则插左进新数组然后我,右小则插右然后r
int[]narr=new int[arr left。长度向左。长度];
int l=0;
int r=0;
for(int I=0;长度;I){ 0
if(l=arr左。长度){ 0
narr[I]=arr right[r];
继续;
}
if(r=arr右。长度){ 0
narr[I]=arr left[l];
继续;
}
if (arrleft[l]=arrright[r]){
narr[I]=arr left[l];
继续;
}
if (arrleft[l]arrright[r]){
narr[I]=arr right[r];
继续;
}
}
返回纳尔
}
公共静态void main(String[]参数){ 0
int[]arrs=guibing(arr);
for(int I=0;长度;I){ 0
系统。出去。println(arrs[I]);
}
}
}
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/139156.html