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

2021-10-03 13:50:13 字數 1383 閱讀 2814

選擇排序、氣泡排序等演算法的時間複雜度都比較好理解,但不是很清楚快速排序的時間複雜度為什麼是o(nlogn)。從《演算法**》中看到的思路,很讚,解決了一直以來的疑惑。

引用自《演算法**》:

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

1、平均情況與最糟情況

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

現在來看看棧的第一層。你將乙個元素用作基準值,並將其他的元素劃分到兩個子陣列中。 這涉及陣列中的全部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)。

2、歸併排序和快速排序的時間複雜度都是 o(nlogn),為什麼說快速排序一般優於歸併排序?

首先搬運stackoverflow的回答:why is mergesort better for linked lists?

翻譯一下:

快速排序中效率的主要**之一是引用位置,在引用位置中,計算機硬體經過優化,因此訪問彼此相鄰的記憶體位置往往比訪問分散在整個記憶體中的記憶體位置更快。quicksort中的分割槽步驟通常具有很好的區域性性,因為它訪問前面和後面附近的連續陣列元素。因此,快速排序往往比其他排序演算法(如heapsort)執行得更好,儘管它通常執行大致相同數量的比較和交換,因為在heapsort的情況下,訪問更加分散。

此外,quicksort通常比其他排序演算法快得多,因為它在原地執行,而不需要建立任何輔助陣列來儲存臨時值。與merge sort相比,這是乙個巨大的優勢,因為分配和釋放輔助陣列所需的時間是顯而易見的。就地操作也提高了quicksort的位置。

使用鍊錶時,這兩個優點都不一定適用。由於鍊錶單元通常分散在整個記憶體中,因此訪問相鄰的鍊錶單元沒有額外的區域性性好處。因此,quicksort的乙個巨大的效能優勢被消耗殆盡。類似地,就地工作的好處不再適用,因為merge sort的鍊錶演算法不需要任何額外的輔助儲存空間。

也就是說,快速排序在鏈結列表中仍然非常快。合併排序往往更快,因為它更均勻地將列表分成兩半,並且每次執行合併所做的工作比執行分割槽步驟所做的工作更少。

快速排序的時間複雜度與空間複雜度

我理解的是,快速排序用的是分治法,運用的遞迴的演算法,先挑選乙個基準值,小於基準值的數放在左邊,大於基準值的數放在基準值的右邊,這樣就涇渭分明的三塊 但是這三塊是有序的,基準值左邊右邊的內 部數是無序的,所以,將基準值左右兩端繼續進行快速排序,直到區間長度為1,排序就完成了。下面使用vs2013實現...

如何理解時間複雜度和空間複雜度

演算法是一種解決問題的方法,對於同乙個問題,往往有很多解決辦法,可是如何來評價解決方案的好壞呢?公認的好方法往往效率高,用時短。要合理的給乙個演算法衡量方式,往往需要從兩個方面入手 時間複雜度和空間複雜度。時間複雜度即通常所說的演算法執行所需要耗費的時間,時間越短,演算法越好。但是,乙個演算法的執行...

理解時間複雜度

本篇概念皆是關於時間複雜度 首先需要了解乙個概念 乙個演算法中的語句執行次數稱為語句頻度或時間頻度。記為 t n 乙個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數多,它花費時間就多 n 稱為問題的規模,當 n 不斷變化時,時間頻度 t n 也會不斷變化。但有時我們想知道...