排序算法之归并排序

参考:https://blog.csdn.net/yushiyi6453/article/details/76407640

/**
 * @param arrays
 * @return
 */
public static int[] mergeSort(int[] arrays, int[] copyarrays, int left, int right) {
    int length = right - left + 1;
    if (null == arrays || 1 >= length)
        return arrays;

    if (length == 2) {//长度为2的时候进行排序
        merge(arrays, copyarrays, left, right);
        return arrays;
    }

    int mid = (left + right) / 2;
    //left sort
    mergeSort(arrays, copyarrays, left, mid);
    //right sort
    mergeSort(arrays, copyarrays, mid + 1, right);
    //merge
    merge(arrays, copyarrays, left, right);

    return arrays;
}

public static void merge(int[] l, int[] c, int left, int right) {
    int length = right - left + 1;
    if (length == 2) {//长度为2的时候进行排序
        int tmp;
        if (l[left] > l[right]) {
            tmp = l[left];
            l[left] = l[right];
            l[right] = tmp;
        }
        return;
    }
    int mid = (left + right) / 2;//合并数组的中间索引值
    int lborder = mid;//左数组的右边界
    int rborder = right;//右数组的右边界

    int le = left;//左数组起始指针
    int ri = mid + 1;//右数组起始指针
    int cleft = left;//临时数组起始指针

    while (cleft <= right) {//合并操作
        if (le > lborder) {
            //right into c
            while (ri <= rborder)
                c[cleft++] = l[ri++];
            break;
        }
        if (ri > rborder) {
            //left into c
            while (le <= lborder)
                c[cleft++] = l[le++];
            break;
        }

        if (l[le] < l[ri])
            c[cleft++] = l[le++];
        else
            c[cleft++] = l[ri++];
    }

    while (left <= right) {//将合并完的结果覆盖原来数据段
        l[left] = c[left++];
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值