算法(一):排序

插入排序

插入排序的思想是:每次將一個待排序的元素排在該元素的前面已排序的子序列中。

直接插入排序

該排序是插入排序最直接的實現。
在排序過程中,進行了n-1趟,每趟操作都有比較和移動的操作,時間複雜度爲O(n^2),穩定。

折半插入排序

和直接插入排序不同,在比較的過程中採用二分法查找,移動元素部分不變,穩定。

希爾排序

先取一個小於n的步長d,然後對間隔爲d的序列進行直接插入排序。
在選取小於d的步長,重複上述操作,知道d=1。
一般可以採取如下的選擇方法:
d1=n2,di+1=di2
注意,希爾排序是不穩定的排序,最壞情況的時間複雜度爲O(n2) ,當n在某個特定範圍時,希爾排序的時間複雜度約爲O(n1.3)

交換排序

交換排序就是通過比較兩個記錄然後決定是否交換其位置。

冒泡排序

從後往前(或從前往後)兩兩比較相鄰元素,若爲逆序則交換。直到整體有序,穩定。

快速排序

基於分治的思想,每次選擇一箇中軸,然後將比該中軸大的放一邊,比中軸小的放另一邊。
快速排序是不穩定的算法,但每一趟排序都會將一個元素放在最終的位置。

選擇排序

直接選擇排序

是選擇排序的直接實現。
每一趟選擇剩下的關鍵字中最大的元素(或最小的元素)放在最後(或最前),直到全部有序。
選擇排序的實現很簡單,基本來說,選擇排序,冒泡排序,插入排序都是十分容易理解和實現的。
選擇排序由於存在元素的交換,因此是不穩定的。

堆排序

堆排序一開始構造一個滿足如下要求的完全二叉樹:
L(i)<=L(2i)且L(i)<=L(2i+1)或者L(i)>=L(2i)且L(i)>=L(2i+1)
這會導致最大(或最小)的元素位於根節點。
然後每次取出根節點後再次調整使滿足上述要求的堆。
雖然像一棵數,堆排序確實只是用了常數個輔助單元,因此空間複雜度爲O(1)。
堆排序的時間複雜度爲O(nlogn)。
另外,堆排序是不穩定的。

歸併排序

考慮兩個已經有序的數組,如果要將他們合併爲一個有序的數組應該如何處理:

分別兩個數組中取第一個元素,並比較,小的那個進入到新數組,並自增,直到一個數組的元素全部進入到新數組,在將另一個數組的剩下元素全部按序放到新數組中

歸併排序就是基於這種思路。

基數排序

也稱爲桶排序。
每一遍排序都比較某一位的大小,並排序,在比較下一位,知道比較到最高位。

外部排序

外部排序的基本思想就是,先排成幾個有序的塊,然後多路歸併排序逐一從小到達。
比如取出每個塊的第一個元素(即最小元素)比較,最小的那個就是整個排序的最小值。

發佈了72 篇原創文章 · 獲贊 50 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章