白話經典算法系列之八 MoreWindows白話經典算法之七大排序總結篇

   在我的博客對冒泡排序直接插入排序直接選擇排序希爾排序歸併排序快速排序堆排序這七種常用的排序方法進行了詳細的講解,並做成了電子書以供大家下載。下載地址爲:http://download.csdn.net/detail/morewindows/4443208

       有網友提議到這本《MoreWindows白話經典算法之七大排序》電子書講解細緻用來平時學習是非常好的,但是頁數有22頁,不太合適做面試前的複習資料。因此在這裏將這七種常用的排序方法進行下總結,以便大家更好的複習這些經典的排序算法,爲面試打下良好的基礎。

 

首先回顧下各種排序的主要思路:

一.       冒泡排序

冒泡排序主要思路是:

通過交換使相鄰的兩個數變成小數在前大數在後,這樣每次遍歷後,最大的數就“沉”到最後面了。重複N次即可以使數組有序。


冒泡排序改進1:在某次遍歷中如果沒有數據交換,說明整個數組已經有序。因此通過設置標誌位來記錄此次遍歷有無數據交換就可以判斷是否要繼續循環。


冒泡排序改進2:記錄某次遍歷時最後發生數據交換的位置,這個位置之後的數據顯然已經有序了。因此通過記錄最後發生數據交換的位置就可以確定下次循環的範圍了。

 

二.       直接插入排序

直接插入排序主要思路是:

每次將一個待排序的數據,插入到前面已經排好序的序列之中,直到全部數據插入完成。

 

三.       直接選擇排序

直接選擇排序主要思路是:

數組分成有序區和無序區,初始時整個數組都是無序區,然後每次從無序區選一個最小的元素直接放到有序區的最後,直到整個數組變有序區。


上面這三種排序都是非常簡單的,下面這四種排序略有難度,希望讀者能多多實踐以加深理解。

 

四.       希爾排序

希爾排序主要思路是:

先將整個待排元素序列分割成若干個子序列(由相隔某個“增量”的元素組成的)分別進行直接插入排序,然後依次縮減增量再進行排序,待整個序列中的元素基本有序(增量足夠小)時,再對全體元素進行一次直接插入排序。由於希爾排序是對相隔若干距離的數據進行直接插入排序,因此可以形象的稱希爾排序爲“跳着插

 

五.       歸併排序

歸併排序主要思路是:

當一個數組左邊有序,右邊也有序,那合併這兩個有序數組就完成了排序。如何讓左右兩邊有序了?用遞歸!這樣遞歸下去,合併上來就是歸併排序。

 

六.       快速排序

快速選擇排序主要思路是:

“挖坑填數+分治法”,首先令i =L; j = R; 將a[i]挖出形成第一個坑,稱a[i]爲基準數。然後j--由後向前找比基準數小的數,找到後挖出此數填入前一個坑a[i]中,再i++由前向後找比基準數大的數,找到後也挖出此數填到前一個坑a[j]中。重複進行這種“挖坑填數”直到i==j。再將基準數填入a[i]中,這樣i之前的數都比基準數小,i之後的數都比基準數大。因此將數組分成二部分再分別重複上述步驟就完成了排序。

 

七.       堆排序

堆排序主要思路用張圖示來表示更好:


可見堆排序的難點就在於堆的的插入和刪除。

堆的插入就是——每次插入都是將新數據放在數組最後,而從這個新數據的父結點到根結點必定是一個有序的數列,因此只要將這個新數據插入到這個有序數列中即可。

堆的刪除就是——堆的刪除就是將最後一個數據的值賦給根結點,然後再從根結點開始進行一次從上向下的調整。調整時先在左右兒子結點中找最小的,如果父結點比這個最小的子結點還小說明不需要調整了,反之將父結點和它交換後再考慮後面的結點。相當於從根結點開始將一個數據在有序數列中進行“下沉”。

因此,堆的插入和刪除非常類似直接插入排序,只不是在二叉樹上進行插入過程。所以可以將堆排序形容爲“樹上插

 

 

再用一張圖表示下這七種常用的排序方法的關係。

 

 


好了,七種常用的排序方法就總結到這了,相信大家上機寫下代碼再看下這張圖必定會印象深刻。在準備面試資料時可以打印最後這張圖,這樣就能在面試前快速的複習一下了,祝大家面試順利,拿到自己滿意的offer。

 

新版電子書《MoreWindows白話經典算法之七大排序第2版(高清)》已經上傳成功,下載地址是:http://download.csdn.net/detail/morewindows/4560056

 

轉載請標明出處,原文地址:http://blog.csdn.net/morewindows/article/details/7961256


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章