为什么快速排序被认为是最快的排序算法?

Why quick sort is considered as fastest sorting algorithm?

快速排序的最坏情况时间复杂度为 O(n^2),而其他如堆排序和合并排序的最坏情况时间复杂度为 O(n log n) ..仍然快速排序被认为更快。 ..为什么?

虽然快速排序确实具有 O(n^2) 的最坏情况时间复杂度,但只要快速排序实现适当地随机化输入,其平均情况(预期) 运行 时间是 O(n log n)

此外,与归并排序等其他流行选择相比,渐近符号隐藏的常数因子在实践中非常重要。因此,在预期中,快速排序将优于其他 O(n log n) 比较排序,尽管最坏情况界限

不完全是这样。 Quicksort 在大多数情况下是最好的,但是它的悲观时间复杂度可以是 O(n^2),这并不意味着它总是如此。问题在于选择正确的枢轴点,如果选择正确,时间复杂度为 O(n log n)。 此外,quicksort 是实现中的 cheapest/easiest 之一。

附带说明一下,如果对整数数组进行排序,则计数/基数排序是最快的。

一般来说,归并排序比快速排序做更多的移动但更少的比较。合并排序的典型实现使用与原始数组大小相同或大小的 1/2 的临时数组(将第二半排序为第二半,将第一半排序为临时数组,将临时数组 + 第二半合并为原始数组) ,所以它比快速排序需要更多 space ,而快速排序最优化只需要 log2(n) 层的嵌套,为了避免最坏情况的嵌套,可以使用嵌套检查并将快速排序更改为堆排序,(这称为自我介绍)。

如果比较开销大于移动开销,则归并排序更快。比较花费的时间比移动花费的时间更长的一个常见示例是对指向字符串的指针数组进行排序。仅移动(4 或 8 字节)指针,而字符串可能明显更大(对于大量字符串而言类似)。

如果要排序的数据有明显的预排序,则 timsort(固定大小的运行)或 "natural" 合并排序(可变大小的运行)会更快。