归并排序小析

关于排序,我们的选择排序和冒泡排序都比较好理解,但是归并排序一直不是很理解,所以最近看了一下:


原理:使用递归,对数组进行二分,最后进行合并的同时实现排序


代码实现:


/**
 * 二分
 * @param arr
 */
public static void half(int[] arr) {
    int o = 0;
    int size = arr.length;
    int m = arr.length / 2;
    int n = arr.length - m;
    int[] left = new int[m];
    int[] right = new int[n];
    System.arraycopy(arr, 0, left, 0, m);
    System.arraycopy(arr, m, right, 0, n);
    if(arr.length > 1){
        half(left);
        half(right);
        merge(left,right,arr);
    }
}


/**
 * 排序合并
 * @param arr   左边
 * @param brr   右边
 * @param temp  合并到的目标数组
 * @return
 */
public static int[] merge(int[] arr, int[] brr, int[] temp) {
    int i = 0;
    int j = 0;
    int k = 0;

    for (int l = 0; l < temp.length; l++) {
        if(arr[i] < brr[j]){
            temp[k] = arr[i];
            i++;
            k++;
            if(i == arr.length){
                System.arraycopy(brr,j,temp,k,brr.length-j);
                break;
            }
        }else {
            temp[k] = brr[j];
            j++;
            k++;
            if(j == brr.length){
                System.arraycopy(arr,i,temp,k,arr.length-i);
                break;
            }
        }
    }

    return temp;
}


调用:

static int[] data = {20,10,30,40,60,50,70,90};
public static void main(String[] arg) {
    half(data);
    System.out.print(Arrays.toString(data)+"\n");
}


这是看了好久之后实现的:里面主要影响是递归的执行顺序,看了几片博文,得到的结论是:

递归执行顺序是先依次递归条件到结束,然后再按照前面的顺序反向执行操作到结束(注意顺序)


而上面在递归的时候,half(left)执行到一个元素后,继续执行的是half(right)....





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值