数据结构与算法(11)归并排序算法

#1、排序原理
归并排序使用的是分治思想(Divide and Conquer),分治,顾名思义,就是分而治之,是将一个大问题分解成小的子问题来解决。小的子问题解决了,大问题也就解决了。

归并排序的核心思想是:如果要排序一个数组,先把数组从中间分成前后两部分,然后再分解,直到每个子序对中只剩一个元素,最后通过递归,层层合并。

在这里插入图片描述

2、代码实现

public static int[] mergeSort(int[] array) {
        if (array.length <=1) return array;
        //取数组的中间位置
        int mid = array.length>>1;
        //数组拆分
        int[] left = Arrays.copyOfRange(array, 0, mid);
        int[] right = Arrays.copyOfRange(array, mid, array.length);
        //递归调用
        int[] result=merge(mergeSort(left), mergeSort(right));
        return result;
    }

    /**
     *  合并,
     * @param left  拆分后左侧数组
     * @param right 拆分后右侧数组
     * @return
     */
    public static int[] merge(int[] left, int[] right) {
        int[] result = new int[left.length + right.length];
        int i=0,j=0; // i用来标识左侧数组 , j用来标识右侧数组
        for (int index = 0; index < result.length; index++) {
            //如果i 大于左侧数组,说明左侧已经没有多余的数组,将剩余的数据拷贝到临时数组
            if (i >= left.length) {
                result[index] = right[j++];
            }
            //如果j大于右侧数组,说明右侧已经没有多余的数组,将剩余的数据拷贝到临时数组
            else if (j >= right.length) {
                result[index] = left[i++];
            }
            //比较两个数组,如果左侧大于右侧数组,就将右侧数组放入到临时数组
            else if (left[i] > right[j]) {
                result[index] = right[j++];
            }
            else{//就将左侧数组放入到临时数组
                result[index] = left[i++];
            }
        }
        return result;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

warybee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值