排序演算法 基數排序

2022-08-24 16:21:13 字數 2016 閱讀 9751

八、基數排序(radix sort)

基數排序原理類似於桶排序。

假設要對10個在0~999範圍內的數排序。一般來說,這是在0~bp-1範圍內的n個數,b是基底,p是某個常數 。顯然不能使用桶排序,這樣使用的桶太多了。訣竅在於使用幾趟桶式排序。比較簡單的做法是從最低有效位開始(lsd)。

以b=10為例,這裡只需要10個桶,多次使用。

先從個位數開始進行桶排序,可能不止乙個數落到同乙個桶裡,把落到同乙個桶裡的數放到乙個表裡。每一趟都是穩定的:例如,進行了個位數的排序後,順序取出,再按十位數裝桶時,若十位數相等的話,個位數是按從小到大的順序入桶的,即入完桶還是有序的

步驟:

1)以個位數的值進行裝桶;

2)將桶裡的數字順序取出來;

3)以十位數的值進行裝桶;

4)順序取出,再按百位......進行裝桶。

eg.

陣列

(從左至右依次是按個、十、百位數進行裝桶的結果)

按個位數排序後,順序取出;

按十位數排序後,順序取出;

按百位數排序後,順序取出;

排序完成。

計算陣列中數值的最大位數:

/*

** 計算輸入資料中值的最大位數

*/int maxbit(vector &a)

if (c >bit)

bit =c;

}return

bit;

}

view code

1

void radix_sort(vector &a)

2; //

待排序數以10為基底,準備10個桶

4int tmp[12];5

int bit = maxbit(a); //

計算待排序數的最大位數

6int c = 1;7

8//按位數操作,從個位開始,共進行bit次排序

9for (int i = 0; i < bit; i++)

1022

23/*

將經過一輪桶排序後的數字順序取出

*/24

for (int i = 1; i < 10;i++)

2528

29for (int j = a.size() - 1; j >= 0; j--)

3036

37/*

將tmp中的數拷回到a中,完成該回合排序

*/38

for (int i = 0; i < a.size(); i++)

3942

43 c = c * 10; //

位數向前挪一位44}

* 將一趟桶排序後的結果順序取出

*/for(int i=1;i<10;i++)  

buckets[i] += buckets[i-1

];for (int j = a.size() - 1; j >= 0; j--)

時間複雜度:演算法執行時間o(p(n+b))n:待排序的元素的個數  

b:基底,也即桶的個數

p:待排序數的最大位數,也即排序進行的趟數

排序演算法 基數排序

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

排序演算法 基數排序

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

排序演算法 基數排序

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