哪种排序算法最适合重新排序几乎完全排序的列表?

Posted

技术标签:

【中文标题】哪种排序算法最适合重新排序几乎完全排序的列表?【英文标题】:Which sorting algorithm is best suited to re-sort an almost fully sorted list? 【发布时间】:2009-10-03 11:57:39 【问题描述】:

我有一个按特定比较函数排序的字符串列表。

现在我必须使用一个不同比较函数重新排序这个列表。

在比较某些特殊字符(例如元音变音)时,这个新的比较函数的行为会略有不同。在大多数情况下,元素只需移动一到两个插槽即可到达正确的位置。

就运行时执行速度而言,哪种排序算法最适合重新排序这个几乎完全排序的列表?

【问题讨论】:

您真的在寻找算法还是只是启发式? Which sort algorithm works best on mostly sorted data? 的可能重复项 【参考方案1】:

Insertion sort 适用于小型或几乎排序的列表。

来自ACM Paper:

对随机生成的列表进行测试 列表长度的各种组合 小排序率表明 直接插入排序是最好的 对于小的或非常接近排序的列表 并且快速排序是最好的 否则。

来自维基文章Insertion sort:

如果输入数组已经排序, 插入排序只执行 n-1 比较,从而进行插入 给定排序时排序更有效 或“接近排序”的数组。

所以问题:Is there ever a good reason to use Insertion Sort?

【讨论】:

请注意,QuickSort 不是 QuickSort,但有非常相似的地方;在现代术语中,QuickerSort 可能被认为是 QuickSort 的一种变体,它总是首先对较短的子集进行排序(最小化堆栈深度以进行递归),并且它有一个简单的分区选择标准,可能容易受到最坏情况性能的影响,但它适用于这里讨论的几乎排序的案例。 @Max:不是真的(@Henk 和我不久前讨论过这个问题)。 BubbleSort 通常无缘无故地使用,其他开发人员从大学时就记得它,而且它很简单(但并不比插入排序简单得多),而且它似乎是一种通用排序,并且当他们使用少量随机排序的项目进行测试时速度很快。在特定场景中选择插入排序。【参考方案2】:

可以访问这两种搜索操作吗?如果是,您可以在第一次排序过程中构建一些哈希树并将其用于其他排序操作

【讨论】:

【参考方案3】:

据我了解,您的数据列表已经排序(比如说按 ascii/国家字符集顺序),但没有适用于特定国家/地区的一些字典规则。例如德国及其元音变音

参见***中的 Germanic_umlaut

您没有插入新项目,您只是想通过更严格的排序规则来使用它们。

您可以在这里阅读示例

http://www.softpanorama.org/Algorithms/Sorting/bubblesort.shtml

冒泡排序适用于所有已排序的列表,只需几个排列。这听起来像冒泡排序是一个很好的算法。另请注意,冒泡排序是“稳定”排序算法。这对您的方案可能很重要。

【讨论】:

【参考方案4】:

对于几乎排序的列表,Comb 排序的变体优于快速排序。我还没有测试过梳状排序与插入排序的比较。

【讨论】:

以上是关于哪种排序算法最适合重新排序几乎完全排序的列表?的主要内容,如果未能解决你的问题,请参考以下文章

一个很好的排序算法,用于大部分排序的数据,但并不完全适合内存? [关闭]

基础算法——排序

世界上最快的排序算法

排序算法之堆排序

《算法 - 排序算法》

五十四最基础的冒泡排序