基數排序和計數排序一樣無需進行比較和交換,和桶排序一樣利用分布和收集兩種基本操作進行排序。基數排序是把每乙個元素拆成多個關鍵字,乙個關鍵字可以在每乙個元素上同等的位置進行計數排序,乙個元素拆成多個關鍵字可以看作是要進行幾輪分桶,以乙個元素最長的長度為準。
基數排序可以看成多(單)關鍵字的排序,可以想象成桶排序那樣分桶排序,也可以像計數排序那樣歸約化分治。
基數排序的思想是將待排序序列中的每組關鍵字進行桶排序。例如整數序列[103, 9, 1,7,11,15, 25, 201, 209, 107, 5]上每個位、十位和百位上的數字看成是乙個關鍵字。
基數排序有兩種方式進行,一種是lsd,從右邊關鍵字開始排序,另一種是msd,從左邊關鍵字開始排序。
我們將輸入陣列[103, 9, 1,7,11,15, 25, 201, 209, 107, 5],從右邊關鍵字開始,以個位數上開始分桶,對於數字,每乙個關鍵字取值範圍是0~9,最多需要10個桶。如果是字元,按ascii碼最多需要128個桶,看情況而定。
為了保證元素之間的穩定性,就按計數排序一樣,將給出乙個統計陣列c,長度為10,統計輸入陣列每乙個元素對應的關鍵字。然後從統計陣列c第2個位置開始,進行當前一項和前一項的累加。累加完之後反向填充陣列b,也將陣列b直接複製到陣列array。
再進行迴圈操作exp *= 10,以十位數上進行分桶,直到超過某個元素的最長長度。
基數排序
初始狀態 [103, 9, 1, 7, 15, 25, 109, 209, 5]
計數c [0, 1, 0, 1, 0, 3, 0, 1, 0, 3]
計數求和c [0, 1, 1, 2, 2, 5, 5, 6, 6, 9]
c [0, 1, 1, 2, 2, 4, 5, 6, 6, 9]
…b [1, 103, 15, 25, 5, 7, 9, 109, 209]
計數c [7, 1, 1, 0, 0, 0, 0, 0, 0, 0]
計數求和c [7, 8, 9, 9, 9, 9, 9, 9, 9, 9]
……計數c [6, 2, 1, 0, 0, 0, 0, 0, 0, 0]
計數求和c [6, 8, 9, 9, 9, 9, 9, 9, 9, 9]
c [5, 8, 9, 9, 9, 9, 9, 9, 9, 9]
b [0, 0, 0, 0, 0, 25, 0, 0, 0]
……b [1, 5, 7, 9, 15, 25, 103, 109, 209]
[1, 5, 7, 9, 15, 25, 103, 109, 209]
基於msd方式的基數排序不能像lsd方式迴圈操作,它是將大問題分解成小問題進行基數排序的。
如果輸入陣列[103, 9, 1,7,11,15, 25, 201, 209, 107, 5],從左邊關鍵字開始,以百位數上開始分桶,進行完一次計數排序之後可以看到上面輸出的陣列b[9, 1, 7, 15, 25, 5, 103, 109, 209],如果還是按照前面的步驟分桶和計數排序,這組陣列就已被打亂了,103、109和209這三個數在十位上為0,是最小的,不符合基數排序。
最好的方式是將大問題分解成乙個個可以解決符合基數排序的小問題。上一次按百位數上開始分桶之後,還要將折回之前的陣列c統計累加的過程。
設定陣列array的low和high的位置,值可以獲取折回統計累加之後的陣列c上對應的值。陣列array中[9, 1, 7, 15, 25, 5], [103, 109], [209]的長度和統計陣列c上的[6, 2, 1]剛好對應,所以當進行遞迴方式的時候low和high上的值可以從陣列c中獲取,exp上的指數也對應的除以10,遞迴終止條件正是exp <= 0。
基數排序
初始狀態 [103, 9, 1, 7, 15, 25, 109, 209, 5]
統計c [6, 2, 1, 0, 0, 0, 0, 0, 0, 0]
求和統計c [6, 8, 9, 9, 9, 9, 9, 9, 9, 9]
c [5, 8, 9, 9, 9, 9, 9, 9, 9, 9]
b [0, 0, 0, 0, 0, 5, 0, 0, 0]
c [5, 8, 8, 9, 9, 9, 9, 9, 9, 9]
b [0, 0, 0, 0, 0, 5, 0, 0, 209]
c [5, 7, 8, 9, 9, 9, 9, 9, 9, 9]
b [0, 0, 0, 0, 0, 5, 0, 109, 209]
……c [0, 7, 8, 9, 9, 9, 9, 9, 9, 9]
b [9, 1, 7, 15, 25, 5, 0, 109, 209]
c [0, 6, 8, 9, 9, 9, 9, 9, 9, 9]
b [9, 1, 7, 15, 25, 5, 103, 109, 209]
遞迴統計c [4, 1, 1, 0, 0, 0, 0, 0, 0, 0]
求和統計c [4, 5, 6, 6, 6, 6, 6, 6, 6, 6]
c [3, 5, 6, 6, 6, 6, 6, 6, 6, 6]
b [0, 0, 0, 5, 0, 0]
c [3, 5, 5, 6, 6, 6, 6, 6, 6, 6]
b [0, 0, 0, 5, 0, 25]
c [3, 4, 5, 6, 6, 6, 6, 6, 6, 6]
b [0, 0, 0, 5, 15, 25]
c [2, 4, 5, 6, 6, 6, 6, 6, 6, 6]
b [0, 0, 7, 5, 15, 25]
c [1, 4, 5, 6, 6, 6, 6, 6, 6, 6]
b [0, 1, 7, 5, 15, 25]
c [0, 4, 5, 6, 6, 6, 6, 6, 6, 6]
b [9, 1, 7, 5, 15, 25]
遞迴統計c [0, 1, 0, 0, 0, 1, 0, 1, 0, 1]
求和統計c [0, 1, 1, 1, 1, 2, 2, 3, 3, 4]
c [0, 1, 1, 1, 1, 1, 2, 3, 3, 4]
b [0, 5, 0, 0]
c [0, 1, 1, 1, 1, 1, 2, 2, 3, 4]
b [0, 5, 7, 0]
c [0, 0, 1, 1, 1, 1, 2, 2, 3, 4]
b [1, 5, 7, 0]
c [0, 0, 1, 1, 1, 1, 2, 2, 3, 3]
b [1, 5, 7, 9]
遞迴[1, 5, 7, 9, 15, 25, 103, 109, 209]
什麼是基數排序?
基數排序 radix sort 是桶排序的擴充套件,它的基本思想是 將整數按位數切割成不同的數字,然後按每個位數分別比較。具體做法是 將所有待比較數值統一為同樣的數字長度,數字較短的數前面補零。然後,從最低位開始,依次進行一次排序。這樣從最低位排序一直到最高位排序完成以後,數列就變成乙個有序序列。通...
什麼是基數排序?
資料結構與演算法 計數排序 在之前的部落格中,我介紹過一種非比較排序 計數排序。計數排序的原理很簡單,就是用乙個陣列來統計每種數字出現的次數,然後按照大小順序將其依次放回原陣列,達成排序的目的。但是計數排序有乙個很嚴重的問題,就是其只能對整數進行排序,一旦遇到字串時,就無能為力了。為了彌補上述的缺點...
排序 基數排序
基數排序 radix sort 是屬於 分配式排序 distribution sort 基數排序法又稱 桶子法 bucket sort 或bin sort,顧名思義,它是透過鍵值的部份資訊,將要排序的元素分配至某些 桶 中,藉以達到排序的作用。排序思想 首先按照資料的最低位 個位 將資料分配到0 9...