Arrays 在哪些情况下合并、堆和快速排序有用?

Arrays 在哪些情况下合并、堆和快速排序有用?,arrays,algorithm,list,sorting,mergesort,Arrays,Algorithm,List,Sorting,Mergesort,我正在研究什么时候哪些排序算法更快更有效。从我到目前为止所读到的有关排序算法(如插入排序)的内容来看,当您使用小数组时,以及当它们几乎被排序或按运行时的平均值O(N)排序时,它是非常有效的 堆排序比较复杂,使用优先级队列。它将内容插入到优先级队列中并将其删除。使用堆时,最好将列表或任何内容的顺序颠倒。mergesort需要稳定性,在链表上效果最好 所以我的问题是,什么时候这些排序算法比其他算法更有用?因为我可以用任何一种,对吗?我会选择哪种算法,以及基于什么,例如,当有这样的场景时 假设我有一个

我正在研究什么时候哪些排序算法更快更有效。从我到目前为止所读到的有关排序算法(如插入排序)的内容来看,当您使用小数组时,以及当它们几乎被排序或按运行时的平均值O(N)排序时,它是非常有效的

堆排序比较复杂,使用优先级队列。它将内容插入到优先级队列中并将其删除。使用堆时,最好将列表或任何内容的顺序颠倒。mergesort需要稳定性,在链表上效果最好

所以我的问题是,什么时候这些排序算法比其他算法更有用?因为我可以用任何一种,对吗?我会选择哪种算法,以及基于什么,例如,当有这样的场景时

假设我有一个包含很少元素的小数组,它几乎已排序

包含200万个元素的大列表,并对它们进行了排序。您只想更改一些元素

一个非常大的数组,包含占用大内存的元素

一个包含几十万个元素的列表,以反向排序。比如说我想改变两千人的位置

假设我有一个包含很少元素的小数组,它几乎已排序

第一种情况是使用小数组,不需要使用诸如合并排序或快速排序之类的高级排序算法。冒泡排序、选择排序或插入排序在这里是最好的(考虑递归等带来的开销)。由于它几乎已排序,插入排序将执行得最好,因为它的最佳情况是O(N)

包含200万个元素的大列表,并对它们进行了排序。您只想更改一些元素

很大程度上取决于什么因素。它们是原始类型吗?如果是这样的话,那么就时间而言,比较它们并不是一个大问题。如果(假设我们使用的是Java),它们是自创建的对象,那么比较它们在时间上可能非常昂贵。在Java中比较长字符串可能非常耗时

有很多元素,所以前面的三个简单算法将被排除在外(插入排序、冒泡排序和选择排序)。您可能希望使用合并排序或快速排序

合并排序比快速排序比较少,但在元素周围移动更多。然而,在这种特殊情况下,我会选择合并排序,因为如果我们在排序顺序中意外地选择了最小值或最大值,那么在如此大的集合中选择一个轴心值确实会花费很多时间

一个非常大的数组,包含占用大内存的元素

再说一次,什么元素?假设您的内存快用完了,快速排序是您的选择。递归调用的开销可能会很高,但在Java中,在这种情况下这并不是一个太大的问题

一个包含几十万个元素的列表,以反向排序。比如说我想改变两千人的位置

没什么大不了的,但元素的类型是什么?这个很棘手。在这里,我们还需要考虑其他因素。我不能仅仅从给定的信息就说一个比另一个好


选择正确的排序算法有点复杂。我们使用的是什么数据结构?如果我们有一个数组,索引速度很快,所以我们需要考虑其他因素。如果我们使用链接结构,也许我们应该尽可能避免使用“基于索引”的算法。我给出的这些例子与规则相去甚远。它们更像是指导方针。选择一个好的排序算法是相对的。希望这至少有一点帮助。

虽然人们可以做出一些有根据的猜测,但通常你必须尝试并衡量哪种算法在你的情况下效果最好。有一件事肯定会告诉你的决定,那就是你是否可以将整个数据放入内存中。有一整套排序算法(称为“外部排序算法”)针对所需的磁盘访问次数而不是比较次数进行了优化。这些只是我在这篇文章中提到的一些例子,但我觉得在考虑选择哪种算法时,你给了我正确的方向。您基本上是在尝试使某个算法适应场景,有时它们的运行非常相似,我想没有一个明确的答案。有时,这完全取决于你分类的数量。有时它归结为你在分类什么等等。有时是明显的,有时不是。一切都是相对的!如果您喜欢,请随意将答案标记为“已接受”:D