-
當(dāng)前位置:首頁 > 創(chuàng)意學(xué)院 > 技術(shù) > 專題列表 > 正文
快速排序?yàn)槭裁词莕logn(快速排序?yàn)槭裁词遣环€(wěn)定的)
大家好!今天讓創(chuàng)意嶺的小編來大家介紹下關(guān)于快速排序?yàn)槭裁词莕logn的問題,以下是小編對(duì)此問題的歸納整理,讓我們一起來看看吧。
開始之前先推薦一個(gè)非常厲害的Ai人工智能工具,一鍵生成原創(chuàng)文章、方案、文案、工作計(jì)劃、工作報(bào)告、論文、代碼、作文、做題和對(duì)話答疑等等
只需要輸入關(guān)鍵詞,就能返回你想要的內(nèi)容,越精準(zhǔn),寫出的就越詳細(xì),有微信小程序端、在線網(wǎng)頁版、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
本文目錄:
一、時(shí)間為O(nlg n)的排序算法 如快速排序 堆排序 nlg是什么意思。好象是lgn。 什么意思?
準(zhǔn)確來說,是log(2,n),即以2為底取n的對(duì)數(shù).
該時(shí)間復(fù)雜度的產(chǎn)生是由于算法中使用了二分法.二分法的其中一個(gè)顯著的標(biāo)志就是使得漸進(jìn)復(fù)雜度變?yōu)?底對(duì)數(shù)級(jí)別.
直觀來說,對(duì)于1000個(gè)數(shù)的排序,效率為O(n)的排序(假設(shè)有)將花費(fèi)1000"單位"的時(shí)間,那么O(n²)的排序?qū)⒒ㄙM(fèi)10^6"單位"的時(shí)間.而O(nlogn)的排序?qū)⒒ㄙM(fèi) 1000*log(1000) ≈ 10000 "單位"的時(shí)間.
這里可以看出其效率的顯著優(yōu)勢(shì),
而通過函數(shù)有關(guān)特征可以得知,對(duì)數(shù)函數(shù)是增長(zhǎng)的越來越慢的,這就使得O(nlogn)的排序可以在越大的工作量中和平方級(jí)排序拉大差距.
二、快速排序的復(fù)雜度怎么算,是多少?
這個(gè),我確實(shí)一點(diǎn)也不懂,幫你搜索。
1.
快速排序-時(shí)空復(fù)雜度:
快速排序每次將待排序數(shù)組分為兩個(gè)部分,在理想狀況下,每一次都將待排序數(shù)組劃分成等長(zhǎng)兩個(gè)部分,則需要logn次劃分。
而在最壞情況下,即數(shù)組已經(jīng)有序或大致有序的情況下,每次劃分只能減少一個(gè)元素,快速排序?qū)⒉恍彝嘶癁槊芭菖判?,所以快速排序時(shí)間復(fù)雜度下界為O(nlogn),最壞情況為O(n^2)。在實(shí)際應(yīng)用中,快速排序的平均時(shí)間復(fù)雜度為O(nlogn)。
快速排序在對(duì)序列的操作過程中只需花費(fèi)常數(shù)級(jí)的空間??臻g復(fù)雜度S(1)。
但需要注意遞歸棧上需要花費(fèi)最少logn最多n的空間。
2.快速排序-隨機(jī)化算法:
快速排序的實(shí)現(xiàn)需要消耗遞歸棧的空間,而大多數(shù)情況下都會(huì)通過使用系統(tǒng)遞歸棧來完成遞歸求解。在元素?cái)?shù)量較大時(shí),對(duì)系統(tǒng)棧的頻繁存取會(huì)影響到排序的效率。
一種常見的辦法是設(shè)置一個(gè)閾值,在每次遞歸求解中,如果元素總數(shù)不足這個(gè)閾值,則放棄快速排序,調(diào)用一個(gè)簡(jiǎn)單的排序過程完成該子序列的排序。這樣的方法減少了對(duì)系統(tǒng)遞歸棧的頻繁存取,節(jié)省了時(shí)間的消費(fèi)。
一般的經(jīng)驗(yàn)表明,閾值取一個(gè)較小的值,排序算法采用選擇、插入等緊湊、簡(jiǎn)潔的排序。一個(gè)可以參考的具體方案:閾值T=10,排序算法用選擇排序。
閾值不要太大,否則省下的存取系統(tǒng)棧的時(shí)間,將會(huì)被簡(jiǎn)單排序算法較多的時(shí)間花費(fèi)所抵消。
另一個(gè)可以參考的方法,是自行建棧模擬遞歸過程。但實(shí)際經(jīng)驗(yàn)表明,收效明顯不如設(shè)置閾值。
3.快速排序的最壞情況基于每次劃分對(duì)主元的選擇。基本的快速排序選取第一個(gè)元素作為主元。這樣在數(shù)組已經(jīng)有序的情況下,每次劃分將得到最壞的結(jié)果。一種比較常見的優(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ù)雜度將毫無疑問的降低到O(n^2)。解決方法是用一種方法進(jìn)行掃描,使沒有交換的情況下主元保留在原位置。
4.設(shè)要排序的數(shù)組是A[0]……A[N-1],首先任意選取一個(gè)數(shù)據(jù)(通常選用第一個(gè)數(shù)據(jù))作為關(guān)鍵數(shù)據(jù),然后將所有比它小的數(shù)都放到它前面,所有比它大的數(shù)都放到它后面,這個(gè)過程稱為一趟快速排序。一趟快速排序的算法是:
1)設(shè)置兩個(gè)變量I、J,排序開始的時(shí)候:I=0,J=N-1;
2)以第一個(gè)數(shù)組元素作為關(guān)鍵數(shù)據(jù),賦值給key,即 key=A[0];
3)從J開始向前搜索,即由后開始向前搜索(J=J-1),找到第一個(gè)小于key的值A(chǔ)[J],并與A[I]交換;
4)從I開始向后搜索,即由前開始向后搜索(I=I+1),找到第一個(gè)大于key的A[I],與A[J]交換;
5)重復(fù)第3、4、5步,直到 I=J; (3,4步是在程序中沒找到時(shí)候j=j-1,i=i+1。找到并交換的時(shí)候i, j指針位置不變。另外當(dāng)i=j這過程一定正好是i+或j+完成的最后另循環(huán)結(jié)束)
例如:待排序的數(shù)組A的值分別是:(初始關(guān)鍵數(shù)據(jù):X=49) 注意關(guān)鍵X永遠(yuǎn)不變,永遠(yuǎn)是和X進(jìn)行比較,無論在什么位子,最后的目的就是把X放在中間,小的放前面大的放后面。
A[0] 、 A[1]、 A[2]、 A[3]、 A[4]、 A[5]、 A[6]:
49 38 65 97 76 13 27
進(jìn)行第一次交換后: 27 38 65 97 76 13 49
( 按照算法的第三步從后面開始找)
進(jìn)行第二次交換后: 27 38 49 97 76 13 65
( 按照算法的第四步從前面開始找>X的值,65>49,兩者交換,此時(shí):I=3 )
進(jìn)行第三次交換后: 27 38 13 97 76 49 65
( 按照算法的第五步將又一次執(zhí)行算法的第三步從后開始找
進(jìn)行第四次交換后: 27 38 13 49 76 97 65
( 按照算法的第四步從前面開始找大于X的值,97>49,兩者交換,此時(shí):I=4,J=6 )
此時(shí)再執(zhí)行第三步的時(shí)候就發(fā)現(xiàn)I=J,從而結(jié)束一趟快速排序,那么經(jīng)過一趟快速排序之后的結(jié)果是:27 38 13 49 76 97 65,即所以大于49的數(shù)全部在49的后面,所以小于49的數(shù)全部在49的前面。
快速排序就是遞歸調(diào)用此過程——在以49為中點(diǎn)分割這個(gè)數(shù)據(jù)序列,分別對(duì)前面一部分和后面一部分進(jìn)行類似的快速排序,從而完成全部數(shù)據(jù)序列的快速排序,最
三、C 語言快速排序最好情況時(shí)間復(fù)雜度為什么是 nlog2n ?(菜鳥在線)
快速排序最好的情況是每次把上一次的數(shù)組平均分成兩個(gè)子數(shù)組。設(shè)數(shù)組總數(shù)一共為n,如果把這n個(gè)數(shù)每次分成2半最后每個(gè)數(shù)組只包含一個(gè)元素,假設(shè)要分k次,則2的k次方=n,解得k=log2 n(log以2為底對(duì)n取對(duì)數(shù)).也就是說要分log2 n次,而每次都是處理n個(gè)數(shù)據(jù)。所以總的時(shí)間復(fù)雜度為O(n*log2 n)。
四、冒泡排序和快速排序在平均意義上, 那種方法比較快(效率高)? 為什么?
明顯快速排序效率高,快排基于二分法,時(shí)間復(fù)雜度是O(nlogn),冒泡排序是O(n^2)
以上就是關(guān)于快速排序?yàn)槭裁词莕logn相關(guān)問題的回答。希望能幫到你,如有更多相關(guān)問題,您也可以聯(lián)系我們的客服進(jìn)行咨詢,客服也會(huì)為您講解更多精彩的知識(shí)和內(nèi)容。
推薦閱讀:
如何快速推銷自己的產(chǎn)品(如何快速推銷自己的產(chǎn)品方法)