排序演算法 基數排序詳解

2021-09-27 11:18:11 字數 2065 閱讀 4444

筆者今天學習字尾陣列,發現需要用到基數排序,所以趕緊學習一波。

基數排序是基於關鍵字排序,先比較第乙個關鍵字,再比較第二個關鍵字。。。

舉個栗子:假如我們有一堆數,17,8,25,78,123,512,250

實際操作時,是將依次將個位、十位、百位的相同的數放入同乙個桶中,高位不足補零。然後再從桶中收集元素。

一、先按個位排序,將個位相同的數放入同乙個桶中

0:250

1:2:512

3:4:

5:25

6:7:17

8:8,78

9:然後我們從桶中收集元素依次得到:250,512,25,17,8,78

二、按十位排序,將十位相同的數放入同乙個桶中

0:81:512,17

2:25

3:4:

5:250

6:7:78

8:9:

然後我們從桶中收集元素依次得到:8,512,17,25,250,78

三、最後按百位排序,將百位相同的數放入乙個桶中

0:8,17,25,78

1:2:250

3:4:

5:512

6:7:

8:9:

然後我們從桶中依次收集元素得到:8,17,25,78,250,512

經過如上操作後,陣列變得有序了。

我們來考慮一下**的實現。首先我們要進行多少個關鍵字次排序,也就是最多有多少位數。然後我們要有10個桶分別代表0~9。然後考慮一下我們怎麼收集每個桶中的元素。我們可以模擬乙個大桶,將所有小桶的元素放進去,記錄乙個相對位置,即對應位相同的放在一起,我們可以處理桶中元素個數的字首和,就知道所有元素的對應位相同的數的最後乙個數所在的位置。這樣我們直接將對應位相同的數倒著放進大桶中就完成收集了。

要是你看不同上述過程也沒有關係,我們假設來收集第二次的元素。

0:81:512,17

2:25

3:4:

5:250

6:7:78

8:9:

首先我們得到十位為0的數有1個,十位為1的有2個,十位為2的有1個,十位為5的數有1個,十位為7的數有1個。

我們處理一波字首和,分別得到0:1,1:3,2:4,5:5,7:6

我們倒著收集:

先收集到250 ,由於十位為5,所以放在十位為5的最後乙個位置即5,位置-1,為4,但不會被訪問,因為十位為5的只有乙個

收集512,由於十位為1,所以放在十位為1的最後乙個位置3,位置-1,為2,

收集25,由於十位為2,所以放在十位為2的最後乙個位置4,位置-1,為3

收集17,由於十位為1,所以放在十位為1的上乙個位置的前乙個,即2,位置-1,為1

收集8:由於十位為0,所以放在十位為0的最後乙個位置1,位置-1,為0

收集78:由於十位為7,所以放在十位為7的最後乙個位置6,位置-1,為5

位置-1:下一次相同位相同的數應該放在的位置,由於我們提前處理了字首和,所以不會位置越界。

按位置收集以後得到:8,17,512,25,250,78

#includeusing namespace std;

const int maxn = 10000 + 7;

int a[maxn]; // 待排序陣列

int n; // 個數

int c[10]; // 小桶

int b[maxn]; // 大桶

int countbit(int *a, int n) // 計算最大位數

} return digit;

}int radixsort(int *a, int n)

for(int j = 1; j < 10; j++) c[j] += c[j-1]; // 每乙個相同數字的第乙個數的位序

for(int j = n - 1; j >= 0; j--)

for(int j = 0; j < n; j++) a[j] = b[j]; // 將大桶中的元素複製回去

radix *= 10; // 比較下一位

} return 0;

}int main()

return 0;

}

排序演算法 基數排序

基數排序 思想 基數排序屬於 分配式排序 分為高位優先法msd和低位優先法lsd 低位優先法lsd 從最低位k0開始排序 對於排好的序列再用次低位k1排序 依次重複,直至對最高位kd 1排好序後,整個序列稱為有序的 這是乙個分 收 分 收 分 收的過程 特點 穩定 空間複雜度 o dn 時間複雜度 ...

排序演算法 基數排序

一 基數排序的思想 不直接比較數與數的大小。把待排序的整數按位分,分為個位,十位 從小到大依次將位數進行排序。實際上分為兩個過程 分配和收集。分配就是 從個位開始,按位數從小到大把資料排好,分別放進0 9這10個桶中 收集就是 依次將0 9桶中的資料放進陣列中 重複這兩個過程直到最高位 二 過程 比...

排序演算法 基數排序

基數排序稱桶排序。它按照記錄的各位值逐步進行排序。適用於整數型別的排序。基數排序不同於別的排序方法通過比較和交換來排序,它是通過按照桶來分配和收集的方法實現的。基本思想 假設待排序的記錄都是m位d進製 不足m位的高位補0 設定d個桶 0,1,d 1 首先將序列中的記錄按照最低位值的大小分配到各個桶中...