如何理解快速排序的時間復雜度是O(nlogn)


本文轉載自:https://blog.csdn.net/u011947630/article/details/104691611

選擇排序、冒泡排序等算法的時間復雜度都比較好理解,但不是很清楚快速排序的時間復雜度為什么是O(nlogn)。從《算法圖解》中看到的思路,很贊,解決了一直以來的疑惑。

引用自《算法圖解》:

快速排序的情況比較棘手,在最糟情況下,其運行時間為O(n2)。。在平均情況下,快速排序的運行時間為O(nlogn)。

平均情況與最糟情況

快速排序的性能高度依賴於你選擇的基准值。

  • 最糟情況
    假設你總是將第一個元素用作基准值,且要處理的數組是有序的。由於快速排序算法不檢查輸入數組是否有序,因此它依然嘗試對其進行排序。注意,數組並沒有被分成兩半,相反,其中一個子數組始終為空,這導致調用棧非常長。在這里插入圖片描述
  • 平均情況
    假設你總是將中間的元素用作基准值,在這種情況下,調用棧如下。 調用棧短得多!因為你每次都將數組分成兩半,所以不需要那么多遞歸調用。你很快就到達 了基線條件,因此調用棧短得多。
    在這里插入圖片描述
    第一個示例展示的是最糟情況,而第二個示例展示的是最佳情況。在最糟情況下,棧長為 O(n),而在最佳情況下,棧長為O(log n)。

現在來看看棧的第一層。你將一個元素用作基准值,並將其他的元素划分到兩個子數組中。 這涉及數組中的全部8個元素,因此該操作的時間為O(n)。在調用棧的第一層,涉及全部8個元素, 但實際上,在調用棧的每層都涉及O(n)個元素。
在這里插入圖片描述
即便以不同的方式划分數組,每次也將涉及O(n)個元素。
在這里插入圖片描述
在這個示例中,調用棧的高度為O(log n),而每層需要的時間為O(n)。因此整個算法需要的時間為O(n) * O(log n) = O(n log n)。這就是最佳情況。 在最糟情況下,有O(n)層,因此該算法的運行時間為O(n) * O(n) = O(n2)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM