摘要:
本文记述了堆排序算法改用多叉堆实现的基本思想和一份参考实现代码,并在说明了算法的性能后用随机数据进行了验证。 ◆ 思想 多叉堆的完全树中,位置为 k 的结点,其父结点的位置为 ⎣(k + (d-2)) / d⎦,其子结点的位置为 k*d - (d-2), k*d - (d-1), ..., k*d, 阅读全文
摘要:
本文记述了堆排序改用前序表示法基本思想和一份参考实现代码,并在说明了算法的性能后用随机数据进行了验证。 ◆ 思想 堆排序算法按照层次操作堆中的元素,即物理位置 k 的结点与位置 2k 或 2k+1 的结点交换。然而用前序表示的堆,其父子结点的位置关系不能简单地计算出来。因此,当算法模型(逻辑上)用的 阅读全文
摘要:
本文记述了针对堆排序同时实施减少数据交换和 Floyd 方法的一份参考实现代码,并在说明了算法的性能后用随机数据进行了验证。 ◆ 思想 减少数据交换的操作,请参考堆排序(二);Floyd 方法,请参考堆排序(三)(此处略去详细说明)。 ◆ 实现 排序代码采用《算法(第4版)》的“排序算法类模板”实现 阅读全文
摘要:
本文记述了针对堆排序实施 Floyd 方法的基本思想和一份参考实现代码,并在说明了算法的性能后用随机数据进行了验证。 ◆ 思想 “大多数在下沉排序期间重新插入堆的元素会被直接加入到堆底。Floyd 在 1964 年观察发现,我们正好可以通过免去检查元素是否到达正确位置来节省时间。”(引《算法(第4版 阅读全文
摘要:
本文记述了针对堆排序微小改动的基本思想和一份参考实现代码,并在说明了算法的性能后用随机数据进行了验证。 ◆ 思想 堆的下沉操作中用到了昂贵的数据交换操作,此改动参考无交换的插入排序的思想,实现了减少数据交换的下沉操作。 先将要下沉的元素存放在临时空间中,再将下降过程中遇到的所有元素逐层上移,待找到下 阅读全文
摘要:
本文记述了堆排序的基本思想和一份参考实现代码,并在说明了算法的性能后用随机数据进行了验证。 ◆ 思想 J.W.J Williams 提出了堆排序的算法,该算法利用了二叉堆有序的性质,将排序的过程分为先构建堆再排序的两个阶段。 先构建堆。从当前待排序范围一半的位置开始向第一个位置扫描,用下沉操作处理每 阅读全文
摘要:
本文记述了堆的基本概念、表示法和操作。 ◆ 概念 堆是一种存放多个元素的数据结构,它要求每个元素都要大于等于或小于等于另外若干特定位置的元素。堆常用完全 d 叉树(以下简称“完全树”)表示,堆中的元素与树上的结点一一对应,这样的完全树是堆有序的,也被称为 d 叉堆。当完全树的每个结点都大于等于它的所 阅读全文
摘要:
本文记述了非递归快速排序的基本思想和一份参考实现代码,并在说明了算法的性能后用随机数据进行了验证。 ◆ 思想 非递归的快速排序,使用一个栈保存待排序子范围的范围边界。在循环中弹出栈顶的范围边界。使用切分函数找到此范围中一个切分位置,保证其左侧子范围内的所有元素都不大于切分位置的元素,右侧子范围内的所 阅读全文
摘要:
本文记述了 J.Bently 和 D.Mcllroy 的快速三向切分快速排序的基本思想和一份参考实现代码,并在说明了算法的性能后用随机数据进行了验证。 ◆ 思想 对比快速排序、快速排序(二)和快速排序(三)可以发现,对于随机数据而言,E.W.Dijkstra 的三向切分快速排序的性能要慢于标准快速排 阅读全文
摘要:
本文记述了 E.W.Dijkstra 的三向切分快速排序的基本思想和一份参考实现代码,并在说明了算法的性能后用随机数据进行了验证。 ◆ 思想 “在有大量重复元素的情况下,快速排序的递归性会使元素全部重复的子数组经常出现。这就有很大的改进潜力,将当前实现的线性对数级的性能提高到线性级别。”(引《算法( 阅读全文