我正在研究哪种排序算法更快更有效。从我到目前为止读到的排序算法(如插入排序)来看,当你使用小数组并且它们几乎被排序或排序时它非常有效,因为运行时将平均为O(N)。
堆排序有点棘手并且使用优先级队列。它将内容插入到优先级队列中并将其删除。使用堆时,优先选择列表的顺序或其他任何内容。 mergesort需要稳定性,并且在链接列表上效果最佳。
所以我的问题是,这些排序算法何时比其他算法更有用?因为可以说我可以使用任何一种,对吧?我会选择哪种算法,并根据例如何时具有这样的场景。
假设我有一个包含少量元素的小数组,它几乎已经排序了。
包含200万个元素的大名单,它们已经排序。你想改变只说几个元素。
一个非常大的数组,其元素占用大量内存。
包含数十万个反向排序元素的列表。说我想改变几千个位置。
答案 0 :(得分:3)
假设我有一个包含少量元素的小数组,它几乎已经排序了。
在第一个使用小数组的情况下,不需要使用Merge sort或Quicksort等高级排序算法。冒泡,选择或插入排序最好(考虑递归等开销)。因为它几乎已经排序,所以插入排序将表现最佳,因为它的最佳情况是O(N)。
包含200万个元素的大名单,它们已经排序。你想改变只说几个元素。
取决于什么元素。它们是原始类型吗?如果是这样,那么比较它们对时间来说不是一个大问题。如果(让我们假设我们使用的是Java)它们是自己创建的对象,那么比较它们可能会非常昂贵。在Java中比较长字符串可能非常耗时。
有许多元素,因此将排除前三个简单算法(插入,冒泡和选择排序)。你想要使用Merge sort或Quicksort。
合并排序比Quicksort要少,但会更多地移动元素。但是,在这种特殊情况下,我会使用Merge排序,因为如果我们在排序顺序中意外选择了最低或最大值,那么在这么大的集合中选择一个数据透视值确实会花费你很多很多时间。
一个非常大的数组,其元素占用大量内存。
再次,有哪些元素?假设你几乎没有记忆,Quicksort是你的选择。递归调用的开销可能很昂贵,但在Java中,在这种情况下就不会出现太多问题。
包含数十万个反向排序元素的列表。说我想改变几千个位置。
不是很大的惊喜,但元素的类型是什么?这个很棘手。在这里,我们还需要考虑其他因素。我不能仅仅根据给定的信息说一个比另一个好。
选择正确的排序算法有点复杂。我们使用什么数据结构?如果我们有一个数组,索引很快,所以我们需要考虑其他因素。如果我们使用链接结构,也许我们应该尽可能避免使用“基于索引的”算法。我给出的这些例子远非规则。他们更像是指导方针。根据具体情况选择一个好的排序算法是相对的。希望这至少有一点帮助。