`
flforever1213
  • 浏览: 123715 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

算法 之 分治 - 合并排序-自底向上合并排序

阅读更多

这一次我们要介绍的是一种元素比较次数较少、比较有效的 自底向上合并排序算法。


假设要对这8个数字的数字排序:9, 4, 5, 2, 1, 7, 4, 6

考虑下面的这个排序方法

首先将输入元素分成4对(8个),合并每对为一个2元素的排序序列,然后将每两个连续的2元素的序列合并成大小为4的排序序列,最后将两个排序序列合并成途中所示的最终的排序序列。


我们这里设A为需要排序的n个元素的数组,首先合并⌊n/2⌋个连续元素对,生成大小为2的n/2⌋排序序列,如果剩余一个元素,就让它进入下一轮迭代。

然后合并⌊n/4⌋个连续的2元素对的序列,生成n/4⌋个大小为4的排序序列,如果剩余一个或者两个元素,就让它们进入下一轮迭代;如果剩余三个元素,将两个已排序的元素和另一个元素合并成一个3元素的排序序列。

继续这个过程,在第i次迭代中,合并n/2i⌋对大小为2i-1的排序序列,生成大小为2in/2i⌋个排序序列。如果有k个剩余元素(1 ≤ k ≤ 2i-1),就将他们放在下一次合并中;如果有k个剩余元素(2i-1 < k < 2i),就将它们合并,形成一个大小为k的排序序列。

 

结合这张图也许你会理解得更加清楚

算法BottomUpSort 的思想实现了这张图的组合过程。

先用变量 mergeSize 存储被合并序列的大小,开始时将 mergeSize 置为1,每次执行外边的 while 循环时被乘以2。

low, middle, high 用来定义两个要排序的序列的边界(方便调用之前讲过的 Merge 算法)。

当 arrayLength 不是 mergeSize 的倍数时,实行步骤 [*]。这种情况下,如果剩余元素的数目比边界 middle 大,就要在大小为 MergeSize 的序列和剩余元素之间再进行一次排序。

 

过程  BottomUpSort

输入  n 个元素的数组 A[1...n]

输出  按非降序排列的数组 A[1...n]

 

算法描述

mergeSize ← 1

while mergeSize < n

    low ← 0;  middle ← low + mergeSize - 1; high ← low + mergeSize × 2 - 1

    while high < n

        Merge(A, low, middle, high)

        low ← high + 1

    end while

    if middle < n then Merge(A, low, middle, n - 1)        ← 步骤 [*]

    mergeSize ← mergeSize × 2

end while

 

算法中用到的 Merge 方法,可以参考:算法之 分治 - 合并排序-合并两个已排序的表

 

此算法的 Java 实现如下所示:

public static void buttomUpSort(int[] array)
{
	int arrayLength = array.length;
	int mergeSize = 1;

	while (mergeSize < arrayLength)
	{
		int low = 0, middle = 0, high = 0;
		while (low + mergeSize * 2 - 1 < arrayLength)
		{
			middle = low + mergeSize - 1;
			high = low + mergeSize * 2 - 1;
			merge(array, low, middle, high);

			low = high + 1;
		}

		middle = low + mergeSize - 1;
		if (middle < arrayLength - 1)
		{
			merge(array, low, middle, arrayLength - 1);
		}

		mergeSize *= 2;
	}
}
1
0
分享到:
评论

相关推荐

    合并排序的c++源程序

    一个简单的合并排序的算法的演示过程。还不错。。

    根号n段归并排序算法

    根号n段归并排序算法的C++代码实现: 1.合并【根号n向下取整】段子数组,使用了自底向上的两两合并策略。 2.算法的总体时间复杂度为nlogn 3.带有详细注释

    数据结构与算法分析第二版 ---C语言描述(附加答案)

    摊还分析11.1 一个无关的智力问题11.2 二项队列11.3 斜堆11.4 斐波那契堆11.4.1 切除左式堆中的节点11.4.2 二项队列的懒惰合并11.4.3 斐波那契堆操作11.4.4 时间界的证明11.5 伸展树总结练习参考文献第12章 高级数据...

    数据结构与算法分析-Java语言描述(第2版)_2_2

    练习 参考文献第12章 高级数据结构及其实现 12.1 自顶向下伸展树 12.2 红黑树 12.2.1 自底向上的插入 12.2.2 自顶向下红黑树 12.2.3 自顶向下的删除 12.3 确定性跳跃表 12.4 aa树 12.5 treap树 ...

    数据结构与算法分析-Java语言描述(第2版)_1_2

    练习 参考文献第12章 高级数据结构及其实现 12.1 自顶向下伸展树 12.2 红黑树 12.2.1 自底向上的插入 12.2.2 自顶向下红黑树 12.2.3 自顶向下的删除 12.3 确定性跳跃表 12.4 aa树 12.5 treap树 ...

    算法导论中文版

     2.3.2 分析分治算法  思考题  本章注记 第3章 函数的增长  3.1 渐近记号  3.2 标准记号与常用函数  思考题  本章注记 第4章 分治策略  4.1 最大子数组问题  4.2 矩阵乘法的Strassen算法  4.3 用...

    数据结构与算法

    自底向上的合并排序算法 ……… 自然合并排序 …………………… 链表结构的合并排序算法 ……… 线性时间排序算法 ………………… 计数排序 ………………………… 桶排序 …………………………… 中位数与第 小元素...

    几种常见的排序方法

    归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。 9.标准...

    数据结构与算法分析_Java语言描述(第2版)

    中文名: 数据结构与算法分析_Java语言描述(第2...12.2.1 自底向上的插入 12.2.2 自顶向下红黑树 12.2.3 自顶向下的删除 12.3 确定性跳跃表 12.4 AA树 12.5 treap树 12.6 kd树 12.7 配对堆 小结 练习 参考文献 索引

    数据结构与算法分析Java语言描述(第二版)

    摊还分析11.1 一个无关的智力问题11.2 二项队列11.3 斜堆11.4 斐波那契堆11.4.1 切除左式堆中的节点11.4.2 二项队列的懒惰合并11.4.3 斐波那契堆操作11.4.4 时间界的证明11.5 伸展树小结练习参考文献第12章 高级...

    数据结构与算法分析_Java_语言描述

    11.4.4 时间界的证明 11.5 伸展树 小结 练习 参考文献 第12章 高级数据结构及其实现 12.1 自顶向下伸展树 12.2 红黑树 12.2.1 自底向上插入 12.2.2 自顶向下红黑树 12.2.3 自顶向下删除 12.3 确定性跳跃...

    计算机算法设计与分析试题.doc

    下列算法中通常以自底向上的方式求解最优解的是( B )。 A、备忘录法 B、动态规划法 C、贪心法 D、回溯法 7、衡量一个算法好坏的标准是(C )。 A 运行速度快 B 占用空间少 C 时间复杂度低 D 代码短 8、以下不可以...

    数据结构与算法分析_Java语言描述(第2版)]

    摊还分析11.1 一个无关的智力问题11.2 二项队列11.3 斜堆11.4 斐波那契堆11.4.1 切除左式堆中的节点11.4.2 二项队列的懒惰合并11.4.3 斐波那契堆操作11.4.4 时间界的证明11.5 伸展树小结练习参考文献第12章 高级数据...

    数据结构与算法分析C描述第三版

    作者简介 : Mark Allen Weiss,1987... 12.2.1 自底向上插入   12.2.2 自顶向下红黑树   12.2.3 自顶向下删除   12.3 确定性跳跃表   12.4 AA树   12.5 treap树   12.6 k-d树   12.7 配对堆 

    数据结构与算法分析 Java语言描述第2版

    摊还分析11.1 一个无关的智力问题11.2 二项队列11.3 斜堆11.4 斐波那契堆11.4.1 切除左式堆中的节点11.4.2 二项队列的懒惰合并11.4.3 斐波那契堆操作11.4.4 时间界的证明11.5 伸展树小结练习参考文献第12章 高级数据...

Global site tag (gtag.js) - Google Analytics