我刚刚写了一篇有关不同排序算法的效率和实用性的文章。我得出的结论是,对完全随机的列表进行排序时,合并排序和快速排序要好得多。我只是想问一下在什么情况下,这种情况下较慢的排序算法(气泡排序和选择排序)会更有用,或者像快速排序和合并排序一样有用。
答案 0 :(得分:0)
请注意,合并排序和快速排序都可能需要额外的内存,无论这是保存堆栈以进行递归还是缓冲区的实际副本所需的堆空间。
气泡排序和选择排序不需要额外的内存。因此,在内存受到严格限制的情况下,将使用它们。
答案 1 :(得分:0)
当我们浪费大量数字(可能少于100个)时,涉及快速排序或合并的递归可能会很昂贵
在这种情况下,插入排序的效果要好得多。
即使Java中排序库的标准实现也使用了快速合并和插入排序的组合
HTH
答案 2 :(得分:0)
有 stable 排序算法,用于比较比较相等的项目以原始顺序排列。如果这对您很重要,那么即使速度较慢,也应使用稳定的排序算法。
在某些情况下,更简单的算法会更快(因为很明显,如果慢速算法没有其他优势,那么它永远不会有用)。
我已经看到一种情况,对数组进行排序,然后对每个数组元素进行少量修改。因此,大多数物品都处于正确的位置,只有很少的物品需要交换。在那种情况下,振动筛被证明是最佳的。
如果您知道该数组已排序,然后更改了少量项目,那么可以使用一种聪明的算法(在cs.stackexchange.com上的某个位置找到该算法):如果k个项目已更改,则您最多可以将2k个项目提取到一个单独的数组中,对其进行排序(最有可能使用Quicksort)并合并两个数组。
如果使用库函数,则不可能是普通的Quicksort。例如,Apple的实现在数组的开头和结尾处查找排序范围,并且如果已经排序的项目数量很多,则可以利用此优势(例如,对两个排序的数组的并置进行线性时间排序)