一、思路

另一种实现归并排序的方法是,先归并微型数组再成对归并得到的子数组,直到将整个数组归并在一起。

我们先进行1-by-1归并,然后2-by-2归并,4-by-4归并,如此下去。

在最后一次归并中,第二个数组可能比第一个数组要小。

二、代码实现

关键代码:

    public static void sort(Comparable[] input) {

        int N = input.length;
aux = new Comparable[N]; for(int sz = 1; sz < N; sz += sz) {
for(int lo = 0; lo < N - sz; lo += sz + sz) {
merge(input, lo, lo+sz-1, Math.min(N-1, lo+sz+sz-1));
}
} }

测试数据:M E R G E S O R T E X A M P L E

输出结果1:

M E R G E S O R T E X A M P L E
merge(input, 0, 0, 1)E M R G E S O R T E X A M P L E
merge(input, 2, 2, 3)E M G R E S O R T E X A M P L E
merge(input, 4, 4, 5)E M G R E S O R T E X A M P L E
merge(input, 6, 6, 7)E M G R E S O R T E X A M P L E
merge(input, 8, 8, 9)E M G R E S O R E T X A M P L E
merge(input, 10, 10, 11)E M G R E S O R E T A X M P L E
merge(input, 12, 12, 13)E M G R E S O R E T A X M P L E
merge(input, 14, 14, 15)E M G R E S O R E T A X M P E L
merge(input, 0, 1, 3)E G M R E S O R E T A X M P E L
merge(input, 4, 5, 7)E G M R E O R S E T A X M P E L
merge(input, 8, 9, 11)E G M R E O R S A E T X M P E L
merge(input, 12, 13, 15)E G M R E O R S A E T X E L M P
merge(input, 0, 3, 7)E E G M O R R S A E T X E L M P
merge(input, 8, 11, 15)E E G M O R R S A E E L M P T X
merge(input, 0, 7, 15)A E E E E G L M M O P R R S T X
A E E E E G L M M O P R R S T X

对比自顶向下:

M E R G E S O R T E X A M P L E
merge(input, 0, 0, 1)E M R G E S O R T E X A M P L E
merge(input, 2, 2, 3)E M G R E S O R T E X A M P L E
merge(input, 0, 1, 3)E G M R E S O R T E X A M P L E
merge(input, 4, 4, 5)E G M R E S O R T E X A M P L E
merge(input, 6, 6, 7)E G M R E S O R T E X A M P L E
merge(input, 4, 5, 7)E G M R E O R S T E X A M P L E
merge(input, 0, 3, 7)E E G M O R R S T E X A M P L E
merge(input, 8, 8, 9)E E G M O R R S E T X A M P L E
merge(input, 10, 10, 11)E E G M O R R S E T A X M P L E
merge(input, 8, 9, 11)E E G M O R R S A E T X M P L E
merge(input, 12, 12, 13)E E G M O R R S A E T X M P L E
merge(input, 14, 14, 15)E E G M O R R S A E T X M P E L
merge(input, 12, 13, 15)E E G M O R R S A E T X E L M P
merge(input, 8, 11, 15)E E G M O R R S A E E L M P T X
merge(input, 0, 7, 15)A E E E E G L M M O P R R S T X
A E E E E G L M M O P R R S T X

输出结果2:

M E R G E S O R T E X A M
merge(input, 0, 0, 1)E M R G E S O R T E X A M
merge(input, 2, 2, 3)E M G R E S O R T E X A M
merge(input, 4, 4, 5)E M G R E S O R T E X A M
merge(input, 6, 6, 7)E M G R E S O R T E X A M
merge(input, 8, 8, 9)E M G R E S O R E T X A M
merge(input, 10, 10, 11)E M G R E S O R E T A X M
merge(input, 0, 1, 3)E G M R E S O R E T A X M
merge(input, 4, 5, 7)E G M R E O R S E T A X M
merge(input, 8, 9, 11)E G M R E O R S A E T X M
merge(input, 0, 3, 7)E E G M O R R S A E T X M
merge(input, 8, 11, 12)E E G M O R R S A E M T X
merge(input, 0, 7, 12)A E E E G M M O R R S T X
A E E E G M M O R R S T X

对比自顶向下:

M E R G E S O R T E X A M
merge(input, 0, 0, 1)E M R G E S O R T E X A M
merge(input, 2, 2, 3)E M G R E S O R T E X A M
merge(input, 0, 1, 3)E G M R E S O R T E X A M
merge(input, 4, 4, 5)E G M R E S O R T E X A M
merge(input, 4, 5, 6)E G M R E O S R T E X A M
merge(input, 0, 3, 6)E E G M O R S R T E X A M
merge(input, 7, 7, 8)E E G M O R S R T E X A M
merge(input, 7, 8, 9)E E G M O R S E R T X A M
merge(input, 10, 10, 11)E E G M O R S E R T A X M
merge(input, 10, 11, 12)E E G M O R S E R T A M X
merge(input, 7, 9, 12)E E G M O R S A E M R T X
merge(input, 0, 6, 12)A E E E G M M O R R S T X
A E E E G M M O R R S T X

当数组长度为2的幂时,自顶向下和自底向上所用的比较次数和数组访问次数正好相同,只是顺序不同。

否则,两种方法所用的比较次数和数组访问次数有所不同。

三、性能分析

结论:对于长度为N的任意数组,自底向上归并排序需要1/2NlgN至NlgN次比较,最多访问数组6NlgN次。

分析:见P279

四、排序复杂度

没有任何基于比较的算法能够保证使用少于lgN! ~ NlgN次比较将长度为N的数组排序。

自底向上归并排序(Merge Sort)的更多相关文章

  1. 经典排序算法 - 归并排序Merge sort

    经典排序算法 - 归并排序Merge sort 原理,把原始数组分成若干子数组,对每个子数组进行排序, 继续把子数组与子数组合并,合并后仍然有序,直到所有合并完,形成有序的数组 举例 无序数组[6 2 ...

  2. 连续线性空间排序 起泡排序(bubble sort),归并排序(merge sort)

    连续线性空间排序 起泡排序(bubble sort),归并排序(merge sort) 1,起泡排序(bubble sort),大致有三种算法 基本版,全扫描. 提前终止版,如果发现前区里没有发生交换 ...

  3. 排序算法二:归并排序(Merge sort)

    归并排序(Merge sort)用到了分治思想,即分-治-合三步,算法平均时间复杂度是O(nlgn). (一)算法实现 private void merge_sort(int[] array, int ...

  4. 归并排序(merge sort)

    M erge sort is based on the divide-and-conquer paradigm. Its worst-case running time has a lower ord ...

  5. 归并排序Merge Sort

    //C语言实现 void mergeSort(int array[],int first, int last) { if (first < last)//拆分数列中元素只剩下两个的时候,不再拆分 ...

  6. 归并排序——Merge Sort

    基本思想:参考 归并排序是建立在归并操作上的一种有效的排序算法.该算法是采用分治法的一个非常典型的应用.首先考虑下如何将2个有序数列合并.这个非常简单,只要从比较2个数列的第一个数,谁小就先取谁,取了 ...

  7. 归并排序Merge sort(转)

    原理,把原始数组分成若干子数组,对每一个子数组进行排序, 继续把子数组与子数组合并,合并后仍然有序,直到全部合并完,形成有序的数组 举例 无序数组[6 2 4 1 5 9] 先看一下每个步骤下的状态, ...

  8. 数据结构 - 归并排序(merging sort)

    归并排序(merging sort): 包含2-路归并排序, 把数组拆分成两段, 使用递归, 将两个有序表合成一个新的有序表. 归并排序(merge sort)的时间复杂度是O(nlogn), 实际效 ...

  9. 数据结构 - 归并排序(merging sort) 具体解释 及 代码

    归并排序(merging sort) 具体解释 及 代码 本文地址: http://blog.csdn.net/caroline_wendy 归并排序(merging sort): 包括2-路归并排序 ...

随机推荐

  1. HTML5 2D平台游戏开发#10Wall Jump

    这个术语不知道怎么翻译比较贴切,但并不妨碍对字面意思的理解,大概就是飞檐走壁.比如: 这是游戏<忍者龙剑传>中的场景,玩家可以通过操纵角色在墙面上移动并跳跃. 首先需要实现角色抓墙这一动作 ...

  2. spark-submit 提交任务

    将工程打成jar 放入到linux中 切换到[root@node4 Desktop]# cd /usr/local/development/spark-2.0-hadoop2.6/bin/ 输入命令 ...

  3. java锁之wait,notify(wait会释放锁,notify仅仅只是通知,不释放锁)

    wait是指在一个已经进入了同步锁的线程内,让自己暂时让出同步锁,以便其他正在等待此锁的线程可以得到同步锁并运行,只有其他线程调用了notify方法(notify并不释放锁,只是告诉调用过wait方法 ...

  4. 出现windows启动服务失败(无法从命令行或调试器启动,需要安装InstallUtil.exe)的解决办法

    两种方法1 从命令行安装2 选择项目-视图-自定义操作   然后将 安装,提交,回滚,卸载分别加入自定义操作,注意InstallClass属性为true

  5. 最实用windows 下python+numpy安装(转载)

    最实用windows 下python+numpy安装 如题,今天兜兜转转找了很多网站帖子,一个个环节击破,最后装好费了不少时间. 希望这个帖子能帮助有需要的人,教你一篇帖子搞定python+numpy ...

  6. PHP性能之语言性能优化:vld——查看代码opcode的神器

    vld介绍 vld是PECL(PHP 扩展和应用仓库)的一个PHP扩展,现在最新版本是 0.14.0(2016-12-18),它的作用是:显示转储PHP脚本(opcode)的内部表示(来自PECL的v ...

  7. LeakCanary Android 和 Java 内存泄露检测

    说起内存泄漏还是挺让人头疼的,而且不是每个手机都会发生的情况,往往又不易察觉,那么今天我们就来介绍下LeakCanary这个工具 githup:https://github.com/square/le ...

  8. React antd嵌入百度编辑器(css加载不到等问题,'offsetWidth' of null)

    之前有看过一些类似的文章,以为嵌入不会遇到太多坑 结果...    其他不说,先来描述下跳坑的过程 先定义Ueditor.js类,这个和网上版本类似 import React, { Component ...

  9. 【BZOJ4804】欧拉心算 莫比乌斯反演+线性筛

    [BZOJ4804]欧拉心算 Description 给出一个数字N Input 第一行为一个正整数T,表示数据组数. 接下来T行为询问,每行包含一个正整数N. T<=5000,N<=10 ...

  10. Ubuntu 12.04使用uginx+fastcgi-mono-server2部署asp.net 网站

    Ubuntu 12.04使用uginx+fastcgi-mono-server2部署asp.net 网站 1.安装nginx和mono-fastcgi-server2 sodu apt-get  in ...