快速排序?qū)W習(xí)總結(jié)

昨天花了一天的時(shí)間學(xué)習(xí)總結(jié)冒泡排序,今天下決心把數(shù)據(jù)結(jié)構(gòu)的相關(guān)內(nèi)容,各種排序,樹,
查找算法等都大概學(xué)習(xí)了一遍,把時(shí)間復(fù)雜度和空間復(fù)雜度等概念理清了,終于有了一點(diǎn)點(diǎn)
的踏實(shí)感,因?yàn)樽约簺]考研,本科基礎(chǔ)也沒打牢,總感覺自己跟任何一個(gè)人都有一大段的差距,
連寫程序和找實(shí)習(xí)工作都覺得自己很沒信心,缺少底氣,因?yàn)橐恍┭芯可锩娲蠹叶紩?huì)的基礎(chǔ)
知識(shí)我絲毫不懂,真是太打擊自己了!!

自己的近期安排:

今天總結(jié)了快速排序,hash函數(shù)等知識(shí)之后,明天開始就要踏踏實(shí)實(shí)的看軟件測(cè)試的論文了!!
在看論文的同時(shí),如果想練練手,最好堅(jiān)持把上學(xué)期的“決策樹”的作業(yè)實(shí)現(xiàn)了,這樣自己
就有信心面對(duì)一切了!!

另外,好好上李老師數(shù)據(jù)挖掘的課!千萬不要遲到,最好6點(diǎn)10分就要去到新信息樓!好好學(xué)習(xí),
去圖書館借幾本好書,提前學(xué)習(xí)和準(zhǔn)備!

還有,明天別忘了問問解婷婷和楊惠她們的英文論文都是從哪下的?怎么搜索,比如,Proges的使用?
怎么知道哪些英文論文比較好?

好了,現(xiàn)在言規(guī)正傳,學(xué)習(xí)快速排序:

快速排序和冒泡排序都是交換排序類型,快排的算法思想是:
每次選一個(gè)基準(zhǔn)值(比如第一個(gè)數(shù)),讓小于這個(gè)基準(zhǔn)值的數(shù)向左移,大于這個(gè)基準(zhǔn)值的數(shù)向右移,
一趟移動(dòng)之后,這個(gè)基準(zhǔn)值就定位到合適的位置了,它的左邊的數(shù)比它小,右邊的數(shù)比它大;一趟可以
定位一個(gè)數(shù),左邊和右邊分別遞歸,n-1趟后所有數(shù)就都定位到合適位置了!

算法分析
???  快速排序的時(shí)間主要耗費(fèi)在劃分操作上,對(duì)長度為k的區(qū)間進(jìn)行劃分,共需k-1次關(guān)鍵字的比較。

(1)最壞時(shí)間復(fù)雜度
???  最壞情況是每次劃分選取的基準(zhǔn)都是當(dāng)前無序區(qū)中關(guān)鍵字最小(或最大)的記錄,劃分的結(jié)果是基準(zhǔn)左邊的子區(qū)間為空(或右邊的子區(qū)間為空),而劃分所得的另一個(gè)非空的子區(qū)間中記錄數(shù)目,僅僅比劃分前的無序區(qū)中記錄個(gè)數(shù)減少一個(gè)。
???  因此,快速排序必須做n-1次劃分,第i次劃分開始時(shí)區(qū)間長度為n-i+1,所需的比較次數(shù)為n-i(1≤i≤n-1),故總的比較次數(shù)達(dá)到最大值:
?????????????? Cmax = n(n-1)/2=O(n2)
???  如果按上面給出的劃分算法,每次取當(dāng)前無序區(qū)的第1個(gè)記錄為基準(zhǔn),那么當(dāng)文件的記錄已按遞增序(或遞減序)排列時(shí),每次劃分所取的基準(zhǔn)就是當(dāng)前無序區(qū)中關(guān)鍵字最小(或最大)的記錄,則快速排序所需的比較次數(shù)反而最多。

(2) 最好時(shí)間復(fù)雜度
???  在最好情況下,每次劃分所取的基準(zhǔn)都是當(dāng)前無序區(qū)的"中值"記錄,劃分的結(jié)果是基準(zhǔn)的左、右兩個(gè)無序子區(qū)間的長度大致相等。總的關(guān)鍵字比較次數(shù):
??????? 0(nlgn)
注意:
???  用遞歸樹來分析最好情況下的比較次數(shù)更簡單。因?yàn)槊看蝿澐趾笞蟆⒂易訁^(qū)間長度大致相等,故遞歸樹的高度為O(lgn),而遞歸樹每一層上各結(jié)點(diǎn)所對(duì)應(yīng)的劃分過程中所需要的關(guān)鍵字比較次數(shù)總和不超過n,故整個(gè)排序過程所需要的關(guān)鍵字比較總次數(shù)C(n)=O(nlgn)。
???  因?yàn)榭焖倥判虻挠涗浺苿?dòng)次數(shù)不大于比較的次數(shù),所以快速排序的最壞時(shí)間復(fù)雜度應(yīng)為0(n2),最好時(shí)間復(fù)雜度為O(nlgn)。

具體的算法描述、代碼實(shí)現(xiàn)、算法分析和動(dòng)畫演示參見:
數(shù)據(jù)結(jié)構(gòu)自考網(wǎng)
http://student.zjzk.cn/course_ware/data_structure/web/paixu/paixu8.3.2.4.htm


附排序的面試題:
來自:http://www.javaref.cn/topics/Question/10566.html
問題:?

a)冒泡 (bubble sort) 和快速排序 (quick sort) 的區(qū)別?它們的時(shí)間復(fù)雜度?

冒泡:每趟排序?qū)⒆畲笾蛋仓玫阶詈笠粋€(gè)位置上,時(shí)間復(fù)雜度為 O(n 平方 ).
快速排序法是對(duì)起泡排序法的一種改進(jìn),
基本思想是通過一趟排序?qū)⒋判蚣o(jì)錄分割成獨(dú)立的兩部分,其中一部分紀(jì)錄的關(guān)鍵字
均比另一部分紀(jì)錄的關(guān)鍵字小,則可以分別對(duì)這兩部分紀(jì)錄繼續(xù)進(jìn)行排序,以達(dá)到整個(gè)序列有序。
時(shí)間復(fù)雜度為 O(NlogN).?

疑問:快排的最壞時(shí)間復(fù)雜度是O(n 平方 ),最好時(shí)間復(fù)雜度到底是 O(Nlog2N),還是 O(NlgN)??
按照“數(shù)據(jù)結(jié)構(gòu)自考網(wǎng)”的分析應(yīng)該是O(Nlog2N),但是《數(shù)據(jù)結(jié)構(gòu)》書上277上的分析,似乎O(Nlog2N)
和O(NlgN)都是合理的,到底是什么呢?明天問問解婷婷吧。

b)在什么情況下快速排序的效果最差? 答案:輸入數(shù)據(jù)逆序排列時(shí)效果最差,蛻化成冒泡????