PerKins Zhu

Le vent se lève,il faut tenter de vivre.

导航

排序—归并排序

Posted on 2016-07-14 12:17  PerKins.Zhu  阅读(235)  评论(0编辑  收藏  举报

一段神奇的递归调用,一段神奇的数组合并!

要想搞清楚,首先弄明白两个问题:1、双层递归怎么走的。2、排好序的数组如何进行有序合并。

  关于第一个问题,建议先看一下http://www.cnblogs.com/PerkinsZhu/p/5668218.html 看明白之后相信会对递归调用理解又进一个层次。

  关于第二个问题,不解释了,在简练的语言也超越不了代码的简洁美!字节看代码吧!

  说明:递归分解到的状态是数组元素只有一个。

       合并之前的两个数组已经是有序状态。

      程序中没有分割数组,只是根据数组下标对原数组进行递归分解。

public void MergeSort(int[] array) {
        printArray("原数组:", array);
        sort(array, 0, array.length-1);
    }

    private void sort(int[] array, int left, int right) {
        if (left >= right)
            return;

        int mid = (left + right) / 2;
        sort(array, left, mid);
        sort(array, mid + 1, right);
        merger(array, left, mid, right);
    }

    private void merger(int[] array, int left, int mid, int right) {
        time++;
        int[] temp = new int[array.length];
        int tempIndex = left;
        int center = mid + 1;
        int tempLeft = left;
        while (left <= mid && center <= right) {
            if (array[left] < array[center]) {
                temp[tempIndex++] = array[left++];
            } else {
                temp[tempIndex++] = array[center++];
            }
        }

        while (left <= mid) {
            temp[tempIndex++] = array[left++];
        }
        while (center <= right) {
            temp[tempIndex++] = array[center++];
        }

        while (tempLeft <= right) {
            array[tempLeft] = temp[tempLeft++];
        }
        printArray("第" + time + "次循环排序结果: ", array);
    }

运行结果:

原数组:              6、3、2、8、0、9、7、1、5、4、
第1次循环排序结果: 3、6、2、8、0、9、7、1、5、4、
第2次循环排序结果: 2、3、6、8、0、9、7、1、5、4、
第3次循环排序结果: 2、3、6、0、8、9、7、1、5、4、
第4次循环排序结果: 0、2、3、6、8、9、7、1、5、4、
第5次循环排序结果: 0、2、3、6、8、7、9、1、5、4、
第6次循环排序结果: 0、2、3、6、8、1、7、9、5、4、
第7次循环排序结果: 0、2、3、6、8、1、7、9、4、5、
第8次循环排序结果: 0、2、3、6、8、1、4、5、7、9、
第9次循环排序结果: 0、1、2、3、4、5、6、7、8、9、

建议运行的时候用   6、3、2、8、0、9、7、1、5、4、 这个数组!