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