【问题标题】:Sorting Algorithms & Time Complexity排序算法和时间复杂度
【发布时间】:2019-11-28 16:23:30
【问题描述】:

就时间复杂度考虑而言,最快的排序算法是什么?

在常用的Sorring算法中,如冒泡排序、插入排序、归并排序、堆排序等最快。

【问题讨论】:

  • 寻找TimSortSmoothSort。这些是不常见但快速的选择。

标签: algorithm data-structures array-algorithms


【解决方案1】:

不久前我问自己这个问题,我决定继续编写一些代码来解决这个问题。该图表在x 轴上显示输入数量,在y 轴上显示时间。

从图中可以看出,RadixSort 通常是最快的,其次是 QuickSort。它们的时间复杂度是:

  • RadixSort:O(N*W),其中 N 是要排序的元素数,W 是存储每个键所需的位数。
  • 快速排序:O(N*logN),其中 N 是要排序的元素数。

无论如何,RadixSort 的速度是有代价的。实际上,这两种算法的空间复杂度如下:

  • RadixSort:O(N+W),其中 N 是要排序的元素数,W 是存储每个键所需的位数。
  • 快速排序:O(1),因为它可以就地完成。

【讨论】:

  • QuickSort 不能在 O(1) 空间中完成。平均而言,递归堆栈帧需要 O(log n) 空间。编写不佳的快速排序最终可能需要 O(n) 堆栈空间并花费 O(n^2) 时间。
【解决方案2】:

算法 时间复杂度 最好 平均 最差

Selection Sort    Ω(n^2)                 θ(n^2)                      O(n^2)
Bubble Sort       Ω(n)                   θ(n^2)                      O(n^2)
Insertion Sort    Ω(n)                   θ(n^2)                      O(n^2)
Heap Sort         Ω(n log(n))            θ(n log(n))                 O(n log(n))
Quick Sort        Ω(n log(n))            θ(n log(n))                 O(n^2)
Merge Sort        Ω(n log(n))            θ(n log(n))                 O(n log(n))
Bucket Sort       Ω(n+k)                 θ(n+k)                      O(n^2) 
Radix Sort        Ω(nk)                  θ(nk)                       O(nk)

快速排序的时间复杂度在最佳情况下为 O(n log n),在平均情况下为 O(n log n),在最坏情况下为 O(n^2)。但由于它在大多数输入的平均情况下具有最佳性能,因此 Quicksort 通常被认为是“最快”的排序算法。

【讨论】: