資料結構與演算法 排序演算法(3)

2021-09-28 20:47:32 字數 2000 閱讀 1908

1、原理

將要排序的資料分到幾個有序的桶裡,每個桶裡的資料再進行排序。桶內的資料排序完畢之後,再把桶裡的資料依次取出,組成的序列就是有序的了。

2、原地排序?

屬於原地排序演算法。主要看桶內排序是否時原地排序演算法,若選擇插入排序,則桶排序就是屬於原地排序,若選擇了快速排序,則不屬於原地排序。

3、穩定性演算法?

不屬於穩定性排序演算法。因為根據我的**實現,桶內資料會申請記憶體,故空間複雜度為o(n)。

4、時間複雜度

(1)最好情況

桶數量很多,並且資料均勻分布在各個桶內。

假設要排序的資料數量為 n,分配的桶的個數為 m,那麼每個桶中的資料的數量為 k = n / m 。桶內採用快速排序演算法,根據之前的推到,快排的時間複雜度為o(nlogn),準確說應該是

c是常數。將 k 代入公式中,得到每個桶的排序時間為

將 k 的計算公式帶入上述公式中,得到如下

m 個桶一共需要的時間為

當 m 接近於 n 時,上述公式就變為如下

所以時間複雜度為 o(n) 。

(2)最壞情況

資料只分配到了乙個桶,演算法退化成快排,時間複雜度為 o(nlogn) 。

5、資料要求

6、適用場景:外部排序(資料儲存在外部磁碟中,資料量比較大,記憶體有限,無法將資料全部載入到記憶體中)

假設有10g的訂單資料,如何按照訂單金額從小到大進行排序?

步驟如下:

1、原理

當要排序的資料 n 非常大時,而資料所處的範圍又較小,比如最小值和最大值分別為 1 和 k ,那麼可以把資料分成 k 個桶,每個桶內的資料都是相同的,從而節省了桶內的排序時間。

實際上計數排序是桶排序一種特殊情況,即:對於桶排序,每個桶內的資料需要進行排序,而計數排序的桶內資料都是相同的,不需要排序。

2、原地排序?

不屬於原地排序演算法。根據**的實現原理,需要使用計數陣列,所以空間複雜度為 o(n) 。

3、穩定性演算法?

屬於穩定性排序演算法。因為在將資料放入桶中時,保持原有資料順序,再復原時按照順序復原可以。

4、時間複雜度

根據演算法的實現原理,只需要遍歷一遍資料即可,時間複雜度為 o(n) 。

5、應用栗子

如何將某省100萬的考生的高考成績從小到大排序?

分數範圍為 0 ~ 900,每一分都有大量考生重合。可以將分數分成 901 個桶,桶內的分數都是相同,只需要遍歷資料, 將資料放入各個桶內即可。

6、適用範圍

1、原理

將待排序的數列中的數拆分成「位」(十進位制),對每一位進行穩定性排序(例如計數排序),直到所有的位都排序完成。

2、原地排序?

不屬於原地排序演算法。因為各個位排序時使用了線性排序演算法。

3、穩定性排序?

屬於穩定性排序。因為針對每一位的操作實際上都是穩定性排序,保證了相同資料的前後位置。

4、時間複雜度

因為對每一位的排序採用計數排序,時間複雜度為 o(n),假設最大的資料所在的位(十進位制)總數為 k,則時間複雜度為o(kn),總體來說時間複雜度約等於 o(n) 。

5、應用栗子

如何對 10 萬個手機號碼你進行從小到大排序?

這裡可以採用基數排序演算法,將所有的手機號碼拆成11個數字,從後向前一次進行計數排序,因為計數排序屬於穩定性 性演算法,這就保證了最終的排序結果是正確的。

6、適用範圍

1、性質

演算法種類

時間複雜度

空間複雜度

原地排序

穩定性排序

桶排序o(n)

o(n)××

計數排序

o(n)

o(n)××

基數排序

o(n)

o(n)××

2、源**

github

參考:極客時間《資料結構與演算法之美》王爭

這門課真心推薦,內容很經典、栗子很形象,裡面還包含了很多面試題目。真是居家旅行必備良藥。

(saw:game over!)

資料結構與演算法 3 初等排序演算法

首先我們為每一種排序類建立less 和exchange 這兩個輔助函式用於物件的比較和位置的交換。為了讓我們的排序類支援不同型別的物件,我們使用了comparble介面。private static boolean less comparable v,comparable w private sta...

資料結構與演算法 排序演算法

帶問題思考以下幾點 1 每個演算法的思想是什麼?2 每個演算法的穩定性怎樣?時間複雜度是多少?3 在什麼情況下,演算法出現最好情況 or 最壞情況?4 每種演算法的具體實現又是怎樣的?n每次選擇乙個元素k插入到之前已排好序的部分a 1 i 中,插入過程中k依次由後向前與a 1 i 中的元素進行比較。...

演算法與資料結構 3 氣泡排序

氣泡排序的基本思想 序列中相鄰兩個元素兩兩比較,當乙個元素大於右邊的元素時,交換置為 否則位置不變。直到整個序列都滿足排序要求為止。下面舉個例子進行說明,如下圖所示 故,對於一組包含n個資料的記錄,氣泡排序就是要每趟排序過程中通過兩兩比較相鄰元素,將小的數字放到前面,大的數字放在後面。氣泡排序在最壞...