algorithm - 为什么不总是使用堆排序

标签 algorithm sorting heapsort

<分区>

Heap Sort 排序算法的最坏情况复杂度似乎为 O(nlogn),并且使用 O(1) 空间进行排序操作。

这似乎比大多数排序算法都要好。那么,为什么人们不总是将堆排序用作一种排序算法(以及为什么人们使用像归并排序或快速排序这样的排序机制)?

另外,我看到人们在堆排序中使用术语“不稳定”。这意味着什么?

最佳答案

稳定排序维护具有相同键的项目的相对顺序。例如,假设您的数据集包含带有员工 ID 和姓名的记录。初始顺序是:

1, Jim
2, George
3, Jim
4, Sally
5, George

您想按名称排序。稳定排序将按以下顺序排列项目:

2, George
5, George
1, Jim
3, Jim
4, Sally

请注意,“George”的重复记录与它们在初始列表中的相对顺序相同。与两个“Jim”记录相同。

不稳定排序可能会这样排列项目:

5, George
2, George
1, Jim
3, Jim
4, Sally

堆排序不稳定,因为对堆的操作会改变相等项的相对顺序。并非所有 Quicksort 实现都是稳定的。这取决于您如何实现分区。

尽管 Heapsort 的最坏情况复杂度为 O(n log(n)),但这并不能说明全部情况。在现实世界的实现中,存在理论分析未考虑的常数因素。在 Heapsort 与 Quicksort 的情况下,事实证明有一些方法(例如,中位数为 5)可以使 Quicksort 的最坏情况确实非常罕见。此外,维护堆也不是免费的。

给定一个服从正态分布的数组,Quicksort 和 Heapsort 都将在 O(n log(n)) 内运行。但是 Quicksort 会执行得更快,因为它的常数因子小于 Heapsort 的常数因子。简单来说,分区比维护堆更快。

关于algorithm - 为什么不总是使用堆排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8311090/

相关文章:

mysql - 复杂的sql分组排序

c++ - 如何在 c 中对 vector<string> 进行比较和排序

sorting - HeapSort 与 MergeSort 空间复杂度

algorithm - 堆排序伪代码算法

arrays - 最小缓冲区的值是多少,这样一个int数组将按升序排序?

c++ - 如何有效地将唯一对象从一个 vector 复制到另一个 vector (由相同对象的子集组成)?

python - python的sorted()函数是否保证稳定?

arrays - 在给定成功搜索概率的情况下,如何找到执行基本操作的次数?

algorithm - 算出算法的下界?

java - 理解 minheap 和 heapSort 方法