归并算法

归并算法采用了分而治之的思想,具体的内容懂的都懂,不懂的也不需要明白,看代码就完事了。

public class guibing {
public static int[] arr = new int[]{8,6,4,7,3,2,5,1};
public static int[] guibing(int[] arr){
//先定义最开始的最左下标和最右下标0和right7
int left = 0;
int right = arr.length-1;
int[] narr = sort(arr,left,right);
return narr;
}

private static int[] sort(int[] arr, int left, int right) {
//递归分治,将序列按照左右划分为一个个子序列,最小子序列长度为1,这时左下标等于右下标
//左节点
if (left == right){
//当分到不能再分时,进行合并,返回一个最小的数组为1,
// 这种方法将会创建n+n/2+n/4+n/8个数组,非常耗费资源,不推荐使用,但是容易理解
//可以进行优化,直接创建size/2大小的临时数组进行储存即可
return new int[]{arr[left]};
}
int l1 = left;
int r1 = (right+left-1)/2;

int l2 = r1+1;
int r2 = right;
//递归分治,将会使左右的下标都被标记到
int[] arrleft = sort(arr,l1,r1);
int[] arrright = sort(arr,l2,r2);
return mergn(arrleft,arrright);
}

private static int[] mergn(int[] arrleft, int[] arrright) {
//合并,使用双指针法进行合并,左小则插左进新数组然后l++,右小则插右然后r++
int[] narr = new int[arrleft.length+arrleft.length];
int l = 0;
int r = 0;

for (int i = 0; i < narr.length; i++) {
if (l>=arrleft.length){
narr[i] = arrright[r++];
continue;
}
if (r>=arrright.length){
narr[i] = arrleft[l++];
continue;
}
if (arrleft[l]<=arrright[r]){
narr[i] = arrleft[l++];
continue;
}
if (arrleft[l]>arrright[r]){
narr[i] = arrright[r++];
continue;
}
}
return narr;
}


public static void main(String[] args) {
int[] arrs = guibing(arr);
for (int i = 0; i < arrs.length; i++) {
System.out.println(arrs[i]);
}
}
}
posted @ 2021-12-08 22:27  高频率巨炮  阅读(109)  评论(0)    收藏  举报