zoukankan      html  css  js  c++  java
  • 排序—归并排序

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

    要想搞清楚,首先弄明白两个问题: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、 这个数组!

  • 相关阅读:
    转:qcow2、raw、vmdk等镜像格式
    openstack配置xen
    透过 Linux 内核看无锁编程
    转:查看进程所消耗的内存
    Ubuntu安装内核源码
    How to mark volume groups as active or inactive
    Failed to access IIS metabase(IIS Exception Problem)
    Android电子书下载:Google Android SDK开发范例大全(第2版)pdf+源码
    几个C++单元测试框架
    JavaScript命名空间namespace的实现方法
  • 原文地址:https://www.cnblogs.com/PerkinsZhu/p/5670010.html
Copyright © 2011-2022 走看看