《大话数据结构》第9章 排序 9.10 总结回顾
9.10?總結回顧
??????? 本章內容只是在講排序,我們需要對已經提到的各個排序算法進行對比來總結回顧。
??????? 首先我們講了排序的定義,并提到了排序的穩(wěn)定性,排序穩(wěn)定對于某些特殊需求來說是至關重要的,因此在排序算法中,我們需要關注此算法的穩(wěn)定性如何。
??????? 我們將排序記錄是否全部被放置在內存中,將排序分為內排序與外排序,外排序需要在內外存之間多次交換數據才能進行。我們本章主要講的是內排序的算法。
??????? 根據排序過程中借助的主要操作,我們將內排序分為:插入排序、交換排序、選擇排序和歸并排序四類。之后介紹的七種排序法,就分別是各種分類的代表算法。
??????? 我們將七種算法的各種指標進行對比,如表9-10-2所示。
??????? 從算法的簡單性來看,我們將七種算法分為兩類
??????? 1)?簡單算法:冒泡、簡單選擇、直接插入。
??????? 2)?改進算法:希爾、堆、歸并、快速。
??????? 從平均情況來看,顯然后三種改進算法要勝過希爾排序,并遠遠勝過前三種簡單算法。
??????? 從最好情況看,反而冒泡和直接插入排序要更勝一籌,也就是說,如果你的待排序序列總是基本有序,反而不應該考慮四種復雜的改進算法。
??????? 從最壞情況看,堆排序與歸并排序又強過快速排序以及其他簡單排序。
??????? 從這三組時間復雜度的數據對比中,我們可以得出這樣一個認識。堆排序和歸并排序就像兩個參加奧數考試的優(yōu)等生,心理素質強,發(fā)揮穩(wěn)定。而快速排序像是很情緒化的天才,心情好時表現極佳,碰到較糟糕環(huán)境會變得差強人意。但是他們如果都來比賽計算個位數的加減法,它們反而算不過成績極普通的冒泡和直接插入。
??????? 從空間復雜度來說,歸并排序強調要馬跑得快,就得給馬吃個飽。快速排序也有相應的空間要求,反而堆排序等卻都是少量索取,大量付出,對空間要求是O(1)。如果執(zhí)行算法的軟件所處的環(huán)境非常在乎內存使用量的多少時,選擇歸并排序和快速排序就不是一個較好的決策了。
??????? 從穩(wěn)定性來看,歸并排序獨占鰲頭,我們前面也說過,對于非常在乎排序穩(wěn)定性的應用中,歸并排序是個好算法。
??????? 從待排序記錄的個數上來說,待排序的個數n越小,采用簡單排序方法越合適。反之,n越大,采用改進排序方法越合適。這也就是我們?yōu)槭裁磳焖倥判騼?yōu)化時,增加了一個閥值,低于閥值時換作直接插入排序的原因。
??????? 從上表的數據中,似乎簡單選擇排序在三種簡單排序中性能最差,其實也不完全是,比如說如果記錄的關鍵字本身信息量比較大(例如關鍵字都是數十位的數字),此時表明其占用存儲空間很大,這樣移動記錄所花費的時間也就越多,我們給出三種簡單排序算法的移動次數比較,如表9-10-3所示。
??????? 總之,從綜合各項指標來說,經過優(yōu)化的快速排序是性能最好的排序算法,但是不同的場合我們也應該考慮使用不同的算法來應對它。
9.11?結尾語
??????? 學完排序,你能夠感受到,我們的算法研究者們都是在“似乎不可能”的情況下,逐步提高排序算法的性能的。在剩下的幾分鐘時間里,我們再來做一道智力題,感受一下把不可能變?yōu)榭赡堋?br /> ??????? 請問如何把圖9-11-1的用四段直線一筆將這九個點連起來?
?
??????? 如果智力題這就結束了,那就不考大家了。現在我的問題是如何做到三段直線一筆將這九個點連起來?
??????? 此時,大家都在交頭接耳,心里一定想著,“這怎么可能?”我來公布答案,那就是用一條“Z”字線即可一筆連成。也許,最快找出這個答案的是那些沒有學過數學的孩子。作為成人,我們已被另一些“框框”所框住大腦。那就是數學上有一條基本公理:兩條平行線永不相交。另外數學上有另一個基本假設:點沒有大小??稍诂F實中任何一點都會有大小。突破這一限制,只要無限延長“Z”字三段線,九點必可一筆連。來看圖9-11-3。
??????? 有同學說,我圖中的點比剛才的要大,這不符合題意。我想有這樣想法的同學,可能還是沒有理解我想表達的意思,事實上,剛才的小黑點再小,它也是有大小的,你可以想像三根直線足夠長,它們就可以將這九個點相連了。
??????? 別急,題目沒完,我現在要求只用一條直線將這九點一筆連,如何做?
??????? 顯然,大家的思維已經被打開。我們可輕易找到答案,因為只要再次突破幾何學中“線沒粗細”的框框,用一條很粗的線,比如蘸了墨水的大刷子,畫一條粗粗的直線將九點全部包含其中即可。
??????? 不是不可能用四段、三段、一段直線一筆連九點,只是暫時還沒有找到方法而已?,F實生活中所有的發(fā)明創(chuàng)造都是建立在打破前人所認定的“框框”的思維定勢基礎上的。這道智力題當然不是要挑戰(zhàn)數學的權威,它只是在給我們啟示:“所有的事情都是可能的,只是我們暫時還沒有找到方法而已?!?
??????? 本章的結束,其實也就是數據結構這門課的結束了。數據結構和算法,還有很多內容我們并沒有涉及。要想真正掌握數據結構,并把它應用到工作中,你們的路還很長。
??????? 我們生命中,矛盾和困惑往往一直伴隨。很多同學來學習數據結構,其實并不是真的明白它的重要性,通常只是因為學校開了這門課,而不得不來這里弄個PASS,過后,真到需要用時,卻發(fā)現力不從心而追悔莫及。比如圖9-11-4,悲劇通常就是這樣產生的。因此盡管現在是課程的最后,對于個別沒有重視這門課的同學來說有些晚了,我還是想再亡羊補牢:數據結構和算法對于程序員的職業(yè)人生來說,那就是兩個圓圈的交集部分,用心去掌握它,你的編程之路將會是坦途。
??????? 同學們,再見! 出處:http://www.cnblogs.com/cj723/archive/2011/04/29/2033000.html
總結
以上是生活随笔為你收集整理的《大话数据结构》第9章 排序 9.10 总结回顾的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《大话数据结构》第9章 排序 9.9 快
- 下一篇: 《大话数据结构》简体中文版勘误