插入排序
插入排序的思想是:每次將一個待排序的元素排在該元素的前面已排序的子序列中。
直接插入排序
該排序是插入排序最直接的實現。
在排序過程中,進行了n-1趟,每趟操作都有比較和移動的操作,時間複雜度爲O(n^2),穩定。
折半插入排序
和直接插入排序不同,在比較的過程中採用二分法查找,移動元素部分不變,穩定。
希爾排序
先取一個小於n的步長d,然後對間隔爲d的序列進行直接插入排序。
在選取小於d的步長,重複上述操作,知道d=1。
一般可以採取如下的選擇方法:
注意,希爾排序是不穩定的排序,最壞情況的時間複雜度爲
交換排序
交換排序就是通過比較兩個記錄然後決定是否交換其位置。
冒泡排序
從後往前(或從前往後)兩兩比較相鄰元素,若爲逆序則交換。直到整體有序,穩定。
快速排序
基於分治的思想,每次選擇一箇中軸,然後將比該中軸大的放一邊,比中軸小的放另一邊。
快速排序是不穩定的算法,但每一趟排序都會將一個元素放在最終的位置。
選擇排序
直接選擇排序
是選擇排序的直接實現。
每一趟選擇剩下的關鍵字中最大的元素(或最小的元素)放在最後(或最前),直到全部有序。
選擇排序的實現很簡單,基本來說,選擇排序,冒泡排序,插入排序都是十分容易理解和實現的。
選擇排序由於存在元素的交換,因此是不穩定的。
堆排序
堆排序一開始構造一個滿足如下要求的完全二叉樹:
L(i)<=L(2i)且L(i)<=L(2i+1)或者L(i)>=L(2i)且L(i)>=L(2i+1)
這會導致最大(或最小)的元素位於根節點。
然後每次取出根節點後再次調整使滿足上述要求的堆。
雖然像一棵數,堆排序確實只是用了常數個輔助單元,因此空間複雜度爲O(1)。
堆排序的時間複雜度爲O(nlogn)。
另外,堆排序是不穩定的。
歸併排序
考慮兩個已經有序的數組,如果要將他們合併爲一個有序的數組應該如何處理:
分別兩個數組中取第一個元素,並比較,小的那個進入到新數組,並自增,直到一個數組的元素全部進入到新數組,在將另一個數組的剩下元素全部按序放到新數組中
歸併排序就是基於這種思路。
基數排序
也稱爲桶排序。
每一遍排序都比較某一位的大小,並排序,在比較下一位,知道比較到最高位。
外部排序
外部排序的基本思想就是,先排成幾個有序的塊,然後多路歸併排序逐一從小到達。
比如取出每個塊的第一個元素(即最小元素)比較,最小的那個就是整個排序的最小值。