【发布时间】:2009-10-03 11:57:39
【问题描述】:
我有一个按特定比较函数排序的字符串列表。
现在我必须使用一个不同比较函数重新排序这个列表。
在比较某些特殊字符(例如元音变音)时,这个新的比较函数的行为会略有不同。在大多数情况下,元素只需移动一到两个插槽即可到达正确的位置。
就运行时执行速度而言,哪种排序算法最适合重新排序这个几乎完全排序的列表?
【问题讨论】:
-
您真的在寻找算法还是只是启发式?
我有一个按特定比较函数排序的字符串列表。
现在我必须使用一个不同比较函数重新排序这个列表。
在比较某些特殊字符(例如元音变音)时,这个新的比较函数的行为会略有不同。在大多数情况下,元素只需移动一到两个插槽即可到达正确的位置。
就运行时执行速度而言,哪种排序算法最适合重新排序这个几乎完全排序的列表?
【问题讨论】:
Insertion sort 适用于小型或几乎排序的列表。
来自ACM Paper:
对随机生成的列表进行测试 列表长度的各种组合 小排序率表明 直接插入排序是最好的 对于小的或非常接近排序的列表 并且快速排序是最好的 否则。
来自维基文章Insertion sort:
如果输入数组已经排序, 插入排序只执行 n-1 比较,从而进行插入 给定排序时排序更有效 或“接近排序”的数组。
【讨论】:
可以访问这两种搜索操作吗?如果是,您可以在第一次排序过程中构建一些哈希树并将其用于其他排序操作
【讨论】:
据我了解,您的数据列表已经排序(比如说按 ascii/国家字符集顺序),但没有适用于特定国家/地区的一些字典规则。例如德国及其元音变音
参见维基百科中的 Germanic_umlaut
您没有插入新项目,您只是想通过更严格的排序规则来使用它们。
您可以在这里阅读示例
http://www.softpanorama.org/Algorithms/Sorting/bubblesort.shtml
冒泡排序适用于所有已排序的列表,只需几个排列。这听起来像冒泡排序是一个很好的算法。另请注意,冒泡排序是“稳定”排序算法。这对您的方案可能很重要。
【讨论】:
对于几乎排序的列表,Comb 排序的变体优于快速排序。我还没有测试过梳状排序与插入排序的比较。
【讨论】: