《大話資料結構》第9章 排序 9.10 總結回顧_大話資料結構

來源:互聯網
上載者:User
9.10 總結回顧

        本章內容只是在講排序,我們需要對已經提到的各個排序演算法進行對比來總結回顧。
        首先我們講了排序的定義,並提到了排序的穩定性,排序穩定對於某些特殊需求來說是至關重要的,因此在排序演算法中,我們需要關注此演算法的穩定性如何。
        我們將排序記錄是否全部被放置在記憶體中,將排序分為內排序與外排序,外排序需要在內外存之間多次交換資料才能進行。我們本章主要講的是內排序的演算法。
        根據排序過程中藉助的主要操作,我們將內排序分為:插入排序、交換排序、選擇排序和歸併排序四類。之後介紹的七種排序法,就分別是各種分類的代表演算法。
        事實上,目前還沒有十全十美的排序演算法,有優點就會有缺點,即使是快速排序法,也只是在整體效能上優越,它也存在排序不穩定、需要大量輔助空間、對少量資料排序無優勢等不足。因此我們就來從多個角度來剖析一下提到的各種排序的長與短。
        我們將七種演算法的各種指標進行對比,如表9-10-2所示。
        從演算法的簡單性來看,我們將七種演算法分為兩類
        1) 簡單演算法:冒泡、簡單選擇、直接插入。
        2) 改進演算法:希爾、堆、歸併、快速。
        從平均情況來看,顯然後三種改進演算法要勝過希爾排序,並遠遠勝過前三種簡單演算法。
        從最好情況看,反而冒泡和直接插入排序要更勝一籌,也就是說,如果你的待排序序列總是基本有序,反而不應該考慮四種複雜的改進演算法。
        從最壞情況看,堆排序與歸併排序又強過快速排序以及其他簡單排序。
        從這三組時間複雜度的資料對比中,我們可以得出這樣一個認識。堆排序和歸併排序就像兩個參加奧數考試的優等生,心理素質強,發揮穩定。而快速排序像是很情緒化的天才,心情好時表現極佳,碰到較糟糕環境會變得差強人意。但是他們如果都來比賽計算個位元的加減法,它們反而算不過成績極普通的冒泡和直接插入。
        從空間複雜度來說,歸併排序強調要馬跑得快,就得給馬吃個飽。快速排序也有相應的空間要求,反而堆排序等卻都是少量索取,大量付出,對空間要求是O(1)。如果執行演算法的軟體所處的環境非常在乎記憶體使用量量的多少時,選擇歸併排序和快速排序就不是一個較好的決策了。
        從穩定性來看,歸併排序獨佔鰲頭,我們前面也說過,對於非常在乎排序穩定性的應用中,歸併排序是個好演算法。

        從待排序記錄的個數上來說,待排序的個數n越小,採用簡單排序方法越合適。反之,n越大,採用改進排序方法越合適。這也就是我們為什麼對快速排序最佳化時,增加了一個閥值,低於閥值時換作直接插入排序的原因。
        從上表的資料中,似乎簡單選擇排序在三種簡單排序中效能最差,其實也不完全是,比如說如果記錄的關鍵字本身資訊量比較大(例如關鍵字都是數十位的數字),此時表明其佔用儲存空間很大,這樣移動記錄所花費的時間也就越多,我們給出三種簡單排序演算法的移動次數比較,如表9-10-3所示。
        你會發現,此時簡單選擇排序就變得非常有優勢,原因也就在於,它是通過大量比較後選擇明確的記錄進行移動,有的放矢。因此對於資料量不是很大,而記錄的關鍵字資訊量較大的排序要求,簡單排序演算法是佔優的。另外,記錄的關鍵字資訊量大小對那四個改進演算法影響不大。
        總之,從綜合各項指標來說,經過最佳化的快速排序是效能最好的排序演算法,但是不同的場合我們也應該考慮使用不同的演算法來應對它。

9.11 結尾語
        學完排序,你能夠感受到,我們的演算法研究者們都是在“似乎不可能”的情況下,逐步提高排序演算法的效能的。在剩下的幾分鐘時間裡,我們再來做一道智力題,感受一下把不可能變為可能。
        請問如何把圖9-11-1的用四段直線一筆將這九個點連起來。
        大家舉手很快,因為絕大數同學應該都看過這道題目。沒有做過題目的同學通常十有八九會落入一個小小的陷阱,在九個點圍成的框中打轉轉,然後發現至少要五段以上的直線才能連成。結果是,要找到答案,必須在思維上突破這九個點所圍成的框框的限制。
 
        如果智力題這就結束了,那就不考大家了。現在我的問題是如何做到三段直線一筆將這九個點連起來。
        此時,大家都在交頭接耳,心裡一定想著,“這怎麼可能。”我來公布答案,那就是用一條“Z”字線即可一筆連成。也許,最快找出這個答案的是那些沒有學過數學的孩子。作為成人,我們已被另一些“框框”所框住大腦。那就是數學上有一條基本公理:兩條平行線永不相交。另外數學上有另一個基本假設:點沒有大小。可在現實中任何一點都會有大小。突破這一限制,只要無限延長“Z”字三段線,九點必可一筆連。來看圖9-11-3。
        有同學說,我圖中的點比剛才的要大,這不符合題意。我想有這樣想法的同學,可能還是沒有理解我想表達的意思,事實上,剛才的小黑點再小,它也是有大小的,你可以想像三根直線足夠長,它們就可以將這九個點相連了。
        別急,題目沒完,我現在要求只用一條直線將這九點一筆連,如何做。
        顯然,大家的思維已經被開啟。我們可輕易找到答案,因為只要再次突破幾何學中“線沒粗細”的框框,用一條很粗的線,比如蘸了墨水的大刷子,畫一條粗粗的直線將九點全部包含其中即可。
        不是不可能用四段、三段、一段直線一筆連九點,只是暫時還沒有找到方法而已。現實生活中所有的發明創造都是建立在打破前人所認定的“框框”的思維定勢基礎上的。這道智力題當然不是要挑戰數學的權威,它只是在給我們啟示:“所有的事情都是可能的,只是我們暫時還沒有找到方法而已。”

        本章的結束,其實也就是資料結構這門課的結束了。資料結構和演算法,還有很多內容我們並沒有涉及。要想真正掌握資料結構,並把它應用到工作中,你們的路還很長。
        我們生命中,矛盾和困惑往往一直伴隨。很多同學來學習資料結構,其實並不是真的明白它的重要性,通常只是因為學校開了這門課,而不得不來這裡弄個PASS,過後,真到需要用時,卻發現力不從心而追悔莫及。比如圖9-11-4,悲劇通常就是這樣產生的。因此儘管現在是課程的最後,對於個別沒有重視這門課的同學來說有些晚了,我還是想再亡羊補牢:資料結構和演算法對於程式員的職業人生來說,那就是兩個圓圈的交集部分,用心去掌握它,你的編程之路將會是坦途。
        最後送大家電影《當幸福來敲門》中的一句話:“You got a dream,you gotta protect it. People can’t do something themselves, they wanna tell you you can’t do it. If you want something, go get it. Period.如果你有夢想的話,就要去捍衛它。當別人做不到的時候,他們就想要告訴你,你也不能。如果你想要些什麼,就得去努力爭取。這就樣。”
        同學們,再見。 出處:http://www.cnblogs.com/cj723/archive/2011/04/29/2033000.html

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.