基數排序法

2021-08-19 15:50:14 字數 1957 閱讀 5078

基數排序是一種常見的演算法,雖然在各個資料結構教材中都能看到,但在面試或筆試中卻很少遇到。雖然知道基數排序的原理,但從未寫過它的實現演算法,最近看了字尾陣列中用到了基數排序,又仔細研究了下,很有收穫。

基數排序不同於其他的排序演算法,它不是基於比較的演算法。基數排序是一種借助多關鍵字排序的思想對單邏輯關鍵字進行排序的方法。它是一種穩定的排序演算法。多關鍵字排序中有兩種方法:最高位優先法(msd)和最低位優先法(lsd)。通常用於對數的排序選擇的是最低位優先法,即先對最次位關鍵字進行排序,再對高一位的關鍵字進行排序,以此類推。

演算法的思想:類似於桶式排序,我們需要給待排序記錄準備10個桶,為什麼是10個??因為乙個數的任何一位上,其數字大小都位於0~9之間,因此採用10個桶,桶的編號分別為0,1,2,3,4...9,對應待排序記錄中每個數相應位的數值,基數排序也是因此而得名。我們先根據待排序記錄的每個數的個位來決定讓其加入哪個桶中。例如:待排序陣列為

278     109    63    930   589   184   505    269   8    83

求取每個數的個位數,依次為:8   9   3  0  9   4  5  9  8  3

依照其個位數決定將其加入哪個桶中

[0]930

[1][2]

[3]63

83[4]

184[5]

505[6]

[7][8]

2788

[9]109

589269

此步驟即為教材中所說的分配,接下來就是要進行收集,依照桶的編號,將含有資料的桶中的資料依次取出,形成的新的資料記錄為:

930   63  83  184  505  278  8  109  589  269

再對這個陣列按照十分位進行分配進桶,收集,最後再按照百位進行分配進桶,收集。就可得到最終的排序結果。

演算法實現:

//

此函式的目的是取得資料每個位上的數值

//i為待取的資料

int getdigit(int i, int d) //

d的值為1、2、3...,表示要求取的相應位的值,1表示求取個位,

return

val;

}

1

//基數排序演算法的具體實現

2void radixsort(int *list, int begin, int end, int

digit)319

20for (i = 1; i < radix; i++)

21 count[i] = count[i] + count[i - 1]; //

count[i]表示第i個桶的右邊界索引

2223

//將資料依次裝入桶中,保證資料的穩定性,此步即為基數排序的分配

24for (i = end; i >= begin; i--)

2530

31//

基數排序的收集

32//

把桶中的資料再倒出來

33for (i = begin, j = 0; i <= end; i++, j++)

34 list[i] =bucket[j];35}

36 }

在演算法實現中,我們用了兩個陣列:count[radix],bucket[end-begin+1]。radix為基數,即桶的個數,所以第乙個for迴圈處count[i]表示第i個桶中裝入了幾個資料,而第二個for迴圈,則是為了標記在每個桶中,最後乙個資料在整個陣列中的右邊界。例如:在上例中,第乙個for迴圈結束後,count[0]=1,count[1]=count[2]=0,count[3]=2;在第二個for迴圈後,count[0]=1,count[1]=count[2]=1,count[3]=3,表示第三個桶中最後乙個元素在陣列中第三個位置。

bucket的大小與待排序陣列大小一樣,是在排序中做收集步驟用。

digit表示各個資料的最大位數。

基數排序法

摘要 1 基數排序法是建立在桶式排序的基礎之上,而桶式排序的缺點就是不方便計算數值很大的陣列 元素個數不一定多 利用基數排序可以解決這個問題 2 基數排序的基本思想是將元素的每一位都拿出來進行比較,比較的順序是從低位到高位。第一次比較之後,再將比較過的資料取出下一位進行比較 注意 比較的是某一位 或...

基數排序法

基數排序的發明可以追溯到1887年赫爾曼 何樂禮在打孔卡片製表機 tabulation machine 上的貢獻。基數排序 radix sort 屬於 分配式排序 distribution sort 又稱 桶子法 bucket sort 或bin sort,顧名思義,它是透過鍵值的部份資訊,將要排序...

基數排序法(Java實現)

class demo 呼叫基數排序函式 lsd radixsort arr,3 輸出排序後的陣列 for int i 0 i arr是要排序的陣列,max是陣列中最大的數有幾位 public static void lsd radixsort int arr,int max 分別統計第k位是0,1,...