我的軟考之路(六)——資料結構與演算法(4)之八大排序
排序是程式設計的基礎,在程式中會經常使用,好的排序方法可以幫助你提高程式執行的效率,所以學好排序,打好基礎,對於程式的優化會手到擒來。無論你的技術多麼強,如果沒有基礎也強不到哪去。
不多說了,我們直接進入今天的主題。
總有人說排序很難,但是我總覺得很簡單,我們只需要瞭解基本思想就好了,通過簡單的例子來加深理解。
1、直接插入排序
(1)簡介:直接插入排序,從字面意思可以看出,直接插入資料完成排序。
(2)基本思想:在插入第i個數時,假設前i-1數已經排好序了,只需要將第i個數插入到i-1中,使得這i個數也是順序的。
(3)例如:
2、希爾排序(Shell排序)
(1)簡介: 希爾排序又稱為縮小增量排序,是對直接插入排序方法的改進。
(2)基本思想:將整個序列分成多個子序列,然後分別進行直接插入排序,直到整個序列中的所有數基本有序時,再對整體進行一次直接插入排序。
(3)例如:
3、簡單選擇排序
(1)簡介:簡單選擇排序也叫直接選擇排序,其實說白了跟直接插入排序的道理特別簡單,效率低。
(2)基本思想:首先在 n個數中選擇一個最小的數,並將它從中刪除,作為新的一組數的第一個;再在剩下的數中選擇最小的數,將它從中刪除,作為新的一組數的第二個。。。。如此反覆,直到排序完成,最後得到一組從小到大排序的數。
(3)例如:
4、堆排序
(1)簡介:堆排序是一個相當有用的排序技術,特別適用於對大量的記錄進行排序。同時,堆排序也是對簡單選擇排序的改進。
堆的定義:n個元素的序列{K1,K2,...,Kn}當滿足下列關係時,稱為堆:Ki≤K2i且Ki≤K2i+1或者Ki≥K2i且Ki≥K2i+1。注意:堆樹必須是一顆完全二叉樹。
(2)基本思想:利用堆積樹這種資料結構所設計的一種排序,可以利用陣列的特點快速的定位指定索引的元素。
最大堆:父結點大於或等於兒子結點
最小堆:父結點小於或等於兒子結點
(3)例如:
將序列{20,60,26,30,36,10}調整為遞增序列。
1、首先將資料建立完全二叉樹,填充規則是按層次遍歷將資料一一填入,最後構建最小堆;
2、提取堆頂並調整刪除隊頂後的元素為新堆;
3、重複第2步,直到堆空;
4、每次提取的堆頂依次排序即為遞增序列。
5、氣泡排序
(1)簡介:氣泡排序,就跟水裡的物體一樣,小的往上浮,大的往下沉。
(2)基本思想:將陣列垂直排列,取出最後一個元素逐個向上交換,得到大數(小數),繼續步驟一的操作,直到排序完成。
(3)例如:
6、快速排序
(1)簡介:快速排序是目前內部排序中速度最快的一種排序演算法。
(2)基本思想:選取一個數據(通常是陣列的第一個數)作為關鍵資料,然後將所有比它小的數都放在它前面,所有比它大的數都放在它後面,這個過程稱為一趟快速排序,再從分開的部分選取基準數,進行分組劃分,重複執行,直到完成。
(3)例如:
7、歸併排序
(1)簡介:歸併排序又稱為二路合併操作,使用合併操作完成排序的演算法。
(2)基本思想:將兩個或兩個以上的有序表合併成一個新的有序表,最後將所有的有序表合成一個整體有序表。
(3)例如:
8、基數排序
(1)簡介:前面介紹的排序方法都是對元素進行的,基數排序是對元組進行的。
(2)基本思想:從低位到高位依次對待排序的數進行分配和收集,經過d趟分配和收集,就可以得到一個有序序列。
(3)例如:
排序演算法對比
總結
人處理影象的能力是最強的,相信你通過這一張張的圖,你已經學會了這八種排序。
後續部落格的更新列表,敬請期待。