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

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

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

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

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

【问题讨论】:

标签: algorithm sorting


【解决方案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 排序的变体优于快速排序。我还没有测试过梳状排序与插入排序的比较。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-16
        • 2023-03-30
        • 2018-10-23
        • 1970-01-01
        相关资源
        最近更新 更多