-
當前位置:首頁 > 創(chuàng)意學院 > 技術 > 專題列表 > 正文
快速排序平均時間復雜度(快速排序平均時間復雜度證明)
大家好!今天讓創(chuàng)意嶺的小編來大家介紹下關于快速排序平均時間復雜度的問題,以下是小編對此問題的歸納整理,讓我們一起來看看吧。
開始之前先推薦一個非常厲害的Ai人工智能工具,一鍵生成原創(chuàng)文章、方案、文案、工作計劃、工作報告、論文、代碼、作文、做題和對話答疑等等
只需要輸入關鍵詞,就能返回你想要的內(nèi)容,越精準,寫出的就越詳細,有微信小程序端、在線網(wǎng)頁版、PC客戶端
官網(wǎng):https://ai.de1919.com。
創(chuàng)意嶺作為行業(yè)內(nèi)優(yōu)秀的企業(yè),服務客戶遍布全球各地,如需了解SEO相關業(yè)務請撥打電話175-8598-2043,或添加微信:1454722008
本文目錄:
一、快速排序
基本思想是:通過一趟排序將要排序的數(shù)據(jù)分割成獨立的兩部分,其中一部分的所有數(shù)據(jù)都比另外一部分的所有數(shù)據(jù)都要小,然后再按此方法對這兩部分數(shù)據(jù)分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數(shù)據(jù)變成有序序列
快速排序算法通過多次比較和交換來實現(xiàn)排序,其排序流程如下:
(1)首先設定一個分界值,通過該分界值將數(shù)組分成左右兩部分。
(2)將大于或等于分界值的數(shù)據(jù)集中到數(shù)組右邊,小于分界值的數(shù)據(jù)集中到數(shù)組的左邊。此時,左邊部分中各元素都小于或等于分界值,而右邊部分中各元素都大于或等于分界值。
(3)然后,左邊和右邊的數(shù)據(jù)可以獨立排序。對于左側的數(shù)組數(shù)據(jù),又可以取一個分界值,將該部分數(shù)據(jù)分成左右兩部分,同樣在左邊放置較小值,右邊放置較大值。右側的數(shù)組數(shù)據(jù)也可以做類似處理
(4)重復上述過程,可以看出,這是一個遞歸定義。通過遞歸將左側部分排好序后,再遞歸排好右側部分的順序。當左、右兩個部分各數(shù)據(jù)排序完成后,整個數(shù)組的排序也就完成了。
下面通過一個例子介紹快速排序算法的思想,假設要對數(shù)組a[10]={6,1,2,7,9,3,4,5,10,8}進行排序,首先要在數(shù)組中選擇一個數(shù)作為基準值,這個數(shù)可以隨意選擇,在這里,我們選擇數(shù)組的第一個元素a[0]=6作為基準值,接下來,我們需要把數(shù)組中小于6的數(shù)放在左邊,大于6的數(shù)放在右邊,怎么實現(xiàn)呢?
我們設置兩個“哨兵”,記為“哨兵i”和“哨兵j”,他們分別指向數(shù)組的第一個元素和最后一個元素,即i=0,j=9。首先哨兵j開始出動,哨兵j一步一步地向左挪動(即j–),直到找到一個小于6的數(shù)停下來。接下來哨兵i再一步一步向右挪動(即i++),直到找到一個數(shù)大于6的數(shù)停下來。
最后哨兵j停在了數(shù)字5面前,哨兵i停在了數(shù)字7面前。此時就需要交換i和j指向的元素的值。
交換之后的數(shù)組變?yōu)閍[10]={6,1,2,5,9,3,4,7,10,8}:
第一次交換至此結束。接下來,由于哨兵i和哨兵j還沒有相遇,于是哨兵j繼續(xù)向前,發(fā)現(xiàn)比6小的4之后停下;哨兵i繼續(xù)向前,發(fā)現(xiàn)比6大的9之后停下,兩者再進行交換。交換之后的數(shù)組變?yōu)閍[10]={6,1,2,5,4,3,9,7,10,8}。
第二次交換至此結束。接下來,哨兵j繼續(xù)向前,發(fā)小比6小的3停下來;哨兵i繼續(xù)向前,發(fā)現(xiàn)i==j了!??!于是,這一輪的探測就要結束了,此時交換a[i]與基準的值,數(shù)組a就以6為分界線,分成了小于6和大于6的左右兩部分:a[10]={3,1,2,5,4,6,9,7,10,8}。
至此,第一輪快速排序完全結束,接下來,對于6左邊的半部分3,1,2,5,4,執(zhí)行以上過程;對于6右邊的半部分9,7,10,8,執(zhí)行以上過程,直到不可拆分出新的子序列為止。最終將會得到這樣的序列:1 2 3 4 5 6 7 8 9 10,到此,排序完全結束。
快速排序的一次劃分算法從兩頭交替搜索,直到low和hight重合,因此其時間復雜度是O(n);而整個快速排序算法的時間復雜度與劃分的趟數(shù)有關。
理想的情況是,每次劃分所選擇的中間數(shù)恰好將當前序列幾乎等分,經(jīng)過log 2 n趟劃分,便可得到長度為1的子表。這樣,整個算法的時間復雜度為O(nlog 2 n)。
最壞的情況是,每次所選的中間數(shù)是當前序列中的最大或最小元素,這使得每次劃分所得的子表中一個為空表,另一子表的長度為原表的長度-1。這樣,長度為n的數(shù)據(jù)表的快速排序需要經(jīng)過n趟劃分,使得整個排序算法的時間復雜度為O(n 2 )。
為改善最壞情況下的時間性能,可采用其他方法選取中間數(shù)。通常采用“三者值取中”方法,即比較H->r[low].key、H->r[high].key與H->r[(low+high)/2].key,取三者中關鍵字為中值的元素為中間數(shù)。
可以證明,快速排序的平均時間復雜度也是O(nlog 2 n)。因此,該排序方法被認為是目前最好的一種內(nèi)部排序方法
二、關于快速排序和歸并排序的時間復雜度
首先你說歸并排序最壞的情形為O(NlogN),這是不正確的歸并排序如果不借助輔助空間的話,復雜度為O(n^2),借助的話就是O(nlogn)(O(nlog2n))歸并排序 平均復雜度是 O(nlogn) 比較快
快速排序快速排序的最壞情況基于每次劃分對主元的選擇。基本的快速排序選取第一個元素作為主元。這樣在數(shù)組已經(jīng)有序的情況下,每次劃分將得到最壞的結果。一種比較常見的優(yōu)化方法是隨機化算法,即隨機選取一個元素作為主元。這種情況下雖然最壞情況仍然是O(n^2),但最壞情況不再依賴于輸入數(shù)據(jù),而是由于隨機函數(shù)取值不佳。實際上,隨機化快速排序得到理論最壞情況的可能性僅為1/(2^n)。所以隨機化快速排序可以對于絕大多數(shù)輸入數(shù)據(jù)達到O(nlogn)的期望時間復雜度。一位前輩做出了一個精辟的總結:“隨機化快速排序可以滿足一個人一輩子的人品需求。”
隨機化快速排序的唯一缺點在于,一旦輸入數(shù)據(jù)中有很多的相同數(shù)據(jù),隨機化的效果將直接減弱。對于極限情況,即對于n個相同的數(shù)排序,隨機化快速排序的時間復雜度將毫無疑問的降低到O(n^2)。解決方法是用一種方法進行掃描,使沒有交換的情況下主元保留在原位置。
綜合來說快速排序速度最快,時間復雜度最小。希望對你有所幫助!
三、請問快速排序的時間復雜度是怎么推算的?
每次分成兩段,那么分的次數(shù)就是logn了哦,每一次處理需要n次計算,那么時間復雜度就是nlogn了!
注意這是平均時間復雜度,因為你分的時候可能并不均勻!
根據(jù)平均情況來說是O(nlogn),因為在數(shù)據(jù)分布等概率的情況下對于單個數(shù)據(jù)來說在logn次移動后就會被放到正確的位置上了。
最壞是O(n^2).這種情況就是數(shù)組剛好的倒序,然后每次去中間元的時候都是取最大或者最小。
四、對于輸入為N個數(shù)進行快速排序算法的平均時間復雜度是多少?
根據(jù)T(n) = T(ðn) + O(n) (0 < ð <1) 則有 T(n) = O(n)
因此關鍵問題是怎樣解決劃分標準的問題, 因此產(chǎn)生下列線性時間找中位數(shù)的算法:
將數(shù)組a有n個元素, 劃分成5個一組, 則共有[n/5]個元素, 對于每組用一般的排序找中位數(shù),需要25次, 則總共需要O(25*[n/5]) = O(n), 然后在這些中位數(shù)中遞歸找其中位數(shù)需要T(n/5)次,然后以找到的中位數(shù)x來作為劃分標準則顯然劃分時間為O(n), 再遞歸的劃分, 顯然最多有3n/4的元素小于或大于x, 則選擇中位數(shù)的總復雜度為:
T(n) = O(n) + T(n/5) + T(3n/4) 有T(n) = O(n)。
因此快速排序的復雜度為T(n) = 2T(n/2) + O(n) 有:T(n) = nlogn。
但最壞情況下復雜度為O(n^2),出現(xiàn)此條件的情況是N個數(shù)原來就已經(jīng)按照規(guī)定要求排好序了。
以上就是關于快速排序平均時間復雜度相關問題的回答。希望能幫到你,如有更多相關問題,您也可以聯(lián)系我們的客服進行咨詢,客服也會為您講解更多精彩的知識和內(nèi)容。
推薦閱讀:
快速編輯不允許編輯商品類目(快速編輯不允許編輯商品類目怎么辦)
一個新產(chǎn)品的營銷方案(新產(chǎn)品如何快速推廣市場)
商業(yè)計劃書市場營銷部分(商業(yè)計劃書市場營銷部分產(chǎn)品)