我有一个按特定比较函数排序的字符串列表。
现在我必须使用不同的比较功能对此列表进行重新排序。
这种新的比较函数在比较某些特殊字符时表现略有不同,例如变形金刚。在大多数情况下,元素必须只移动一个或两个插槽才能到达正确的位置。
哪种排序算法最适合根据运行时执行速度对这个几乎完全排序的列表进行重新排序?
答案 0 :(得分:14)
Insertion sort适用于小型或近乎排序的列表。
从此ACM Paper:
测试随机生成的列表 列表长度的各种组合 小分类比率表明 Straight Insertion Sort是最好的 对于小型或非常接近排序的列表 而Quickersort是最好的 否则。
来自维基文章Insertion sort:
如果输入数组已经排序, 插入排序只执行n-1 比较,从而进行插入 在给定排序时排序更有效 或“近乎排序”的数组。
答案 1 :(得分:0)
是否可以访问这两种搜索操作?如果是,您可以在第一个排序过程中构建一些哈希树,并将其用于其他排序操作
答案 2 :(得分:0)
据我所知,您的数据列表已经全部排序(比如ascii / country charset order),但没有为特定国家/地区应用某些字典规则。例如德国和他们的变形金刚
请参阅维基百科中的Germanic_umlaut
你没有插入新项目,你只想通过更严格的排序规则来诉诸它们。
你可以在这里阅读
http://www.softpanorama.org/Algorithms/Sorting/bubblesort.shtml
冒泡排序适用于所有已排序的列表,只需几个排列。这听起来像冒泡排序是很好的算法开始。另请注意,冒泡排序是“稳定”的排序算法。这对您的场景非常重要。
答案 3 :(得分:0)
对于近乎排序的列表,Comb排序的变体优于Quicksort。我还没有测试梳子排序与插入排序的比较。