归并排序代码图解

在这里插入图片描述

归并排序将两个或者以上的有序表组合成一个新的有序表,通过不断的二二归并,最后形成有序的数组

public static int[] mergeSort(int[] a,int low,int high){
    int mid = (low+high)/2;
    if(low<high){
        mergeSort(a,low,mid);
        mergeSort(a,mid+1,high);
        merge(a,low,mid,high);
    }
    return a;
}


public static void merge(int[] a, int low, int mid, int high) {
    int[] temp = new int[high-low+1];
    int i= low;
    int j = mid+1;
    int k=0;
    while(i<=mid && j<=high){
        if(a[i]<a[j]){
            temp[k++] = a[i++];
        }else{
            temp[k++] = a[j++];
        }
    }
    while(i<=mid){
        temp[k++] = a[i++];
    }
    while(j<=high){
        temp[k++] = a[j++];
    }
    for(int x=0;x<temp.length;x++){
        a[x+low] = temp[x];
    }
}

归并的基本流程如下图,本质是将两个有序数组合并成为一个成为一个有序数组,merge方法的变量在图中的具体表示
在这里插入图片描述但是呢,是不是一看就会,一写就废呢?看下面的具体方法执行流程图,其实并没有我们想象的那么简单的执行。
在这里插入图片描述
说说合并数组,以merge(a,0,0,1)为例子,这个例子比较特殊,属于比较的边界情况
low:0 mid:0 high:1
在这里插入图片描述
这三个while判断,其中第一个是判断是否到达边界,即归并的边界,上述的例子刚刚好在等于的情况,如果再i++或者j++则跳出循环,里面谁的值大则添加到新数组,并++,当有一个数组到达边界就会进行下面的两个循环判断,将没满的元素也添加到信数组中,最后for循环覆盖原数组。
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值