java 实现二分归并排序

首先 解释一下什么是归并排序的精髓就是把一个乱序数组划分成小的数组来排序,然后再把小的数组合并成大的小组,下面的这张图能够明确说明什么是归并排序

虽然看图感觉二路归并排序很简单,但是实际操作起来还是有一点麻烦的

这是主函数

public static void main(String[] args) {
        int[] array = new int[] { 10, 9, 5, 11, 45, 23, 2, 13 };
        splitArray(array, 0, array.length - 1);
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i] + " ");
        }

    }
    private static void sort(int[] array, int left, int mid, int right) {
        int[] leftArray = new int[mid-left];//第一个数组的长度
        int[] rightArray = new int[right - mid + 1];//第二个数组的长度
        int i = 0, j = 0, k = 0;
        for (i = left; i < mid; i++)//将最传进来大的数组分成两个小的数组,分别为LeftArray与RightArray
            leftArray[i - left] = array[i];
        for (i = mid; i <= right; i++)
            rightArray[i - mid] = array[i];
        i = 0;
        j = 0;
        k = left;
        while (i < mid - left && j < right - mid + 1) {//任意一个不满足条件即可退出
            /*
             * 这里就是把两个数组有序的合在一起的精髓,将第一个数组的第一个元素与第二个数组的第一个元素相比较,如果第一个数组的元素是小的就讲这个值复制给最大的数组的第一位
             * 然后最大数组与复制给最大数组的数组下标都自加
             */
            if (leftArray[i] < rightArray[j]) {
                array[k++] = leftArray[i++];

            } else {
                array[k++] = rightArray[j++];

            }

        }
    /*
     * 上面的while循环跳出 检查将后面的没有排完的值全部加给最大的数组
     */
        while (i < mid - left) {
            array[k++] = leftArray[i++];
        }
        while (j < right - mid + 1) {
            array[k++] = rightArray[j++];
        }

    }

这里就是合并了,把两个数组合并为一个数组

然后我们看最为核心的东西

private static void splitArray(int[] array, int left, int right) {

        if (left == right) {
            return;
        } else {
            int mid = (right + left) >> 1;//得到中间值
            splitArray(array, left, mid);//处理左边的数组
            splitArray(array, mid+1, right);//处理右边的数组
            sort(array, left, mid+1 , right);//归并

        }
    }

在这里将传递进来的左边与右边分别是最大数组的最大下标与最小下标,将他们除2 我们就可以得到他的中间值,然后递归第一个递归是处理左边的数组将左边的数组分割,第二个递归是处理右边的递归,第三个递归就是调用第二个sort函数将他们排序并且组合在一起

也许在三个递归你会感觉到理解有点困难,我们来debug 调试一下你就会发现他的规律了

这里写图片描述
这里写图片描述

End!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值