基數排序 桶排

2021-09-25 15:42:06 字數 2542 閱讀 5676

基本思想:將所有待比較數值(正整數)統一為同樣的數字長度,數字較短的數前面補零。然後,從最低位開始,依次進行一次排序。這樣從最低位排序一直到最高位排序完成以後,數列就變成乙個有序序列。

複雜度和穩定性情況:

演算法步驟:

基數排序的方式可以採用 lsd(least significant digital)或 msd(most significant digital),lsd 的排序方式由鍵值的最右邊開始,而 msd 則相反,由鍵值的最左邊開始。

不妨通過乙個具體的例項來展示一下基數排序是如何進行的。 設有乙個初始序列為: r 。

我們知道,任何乙個阿拉伯數,它的各個位數上的基數都是以 0~9 來表示的,所以我們不妨把 0~9 視為 10 個桶。

我們先根據序列的個位數的數字來進行分類,將其分到指定的桶中。例如:r[0] = 50,個位數上是 0,將這個數存入編號為 0 的桶中。

分類後,我們在從各個桶中,將這些數按照從編號 0 到編號 9 的順序依次將所有數取出來。這時,得到的序列就是個位數上呈遞增趨勢的序列。

按照個位數排序: 。

接下來,可以對十位數、百位數也按照這種方法進行排序,最後就能得到排序完成的序列。

c++實現**如下:

#include #include using namespace std;

// 求出陣列中最大數的位數的函式

int maxbit(vectorinput)

}// 陣列最大值的位數

int bits_num = 0;

while (max_data)

return bits_num;}

// 取數***上的第d位數字

int digit(int num, int d)

return num / pow % 10;}

// 基數排序

vectorradixsort(vectorinput, int n)

// 統計各個桶中的個數

for (i = 0; i < n; i++)

/** 比如某次經過上面統計後結果為:[0, 2, 3, 3, 0, 0, 0, 0, 0, 0]則經過下面計算後 結果為: [0, 2,

* 5, 8, 8, 8, 8, 8, 8, 8]但實質上只有如下[0, 2, 5, 8, 0, 0, 0, 0, 0, 0]中

* 非零數才用到,因為其他位不存在,它們分別表示如下:2表示比較位為1的元素可以存放在索引為1、0的

* 位置,5表示比較位為2的元素可以存放在4、3、2三個(5-2=3)位置,8表示比較位為3的元素可以存放在

* 7、6、5三個(8-5=3)位置

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

/** 注,這裡只能從陣列後往前迴圈,因為排序時還需保持以前的已排序好的順序,不應該打

* 亂原來已排好的序,如果從前往後處理,則會把原來在前面會擺到後面去,因為在處理某個

* 元素的位置時,位記數器是從大到到小(count[digit(arr[i], d)]--)的方式來處

* 理的,即先存放索引大的元素,再存放索引小的元素,所以需從最後乙個元素開始處理。

* 如有這樣的乙個序列[212,213,312],如果按照從第乙個元素開始迴圈的話,經過第一輪

* 後(個位)排序後,得到這樣乙個序列[312,212,213],第一次好像沒什麼問題,但問題會

* 從第二輪開始出現,第二輪排序後,會得到[213,212,312],這樣個位為3的元素本應該

* 放在最後,但經過第二輪後卻排在了前面了,所以出現了問題

*/for (i = n - 1; i >= 0; i--)

// 臨時陣列複製到 input 中

for (i = 0; i < n; i++)

}return input;}

void main()

; vectortest(arr, arr + sizeof(arr) / sizeof(arr[0]));

cout << "排序前:";

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

cout << endl;

vectorresult = test;

result = radixsort(result, result.size());

cout << "排序後:";

for (i = 0; i < result.size(); i++)

cout << endl;

system("pause");

}

執行結果如下:

其他排序演算法: 

堆排直接插入排序

希爾排序(優化版)

快速排序(遞迴版和非遞迴版)

氣泡排序及其優化

直接選擇排序

歸併排序

基數排序(桶排序)

1。什麼是基數排序 radix sort 基數排序 屬於分配式排序 distribution sort 又稱 桶排序 bucket sort 它是通過鍵值的各個位的值,將要排序的元素分配至某些 桶 中,達到排序的作用。2.它和歸併一樣,屬於穩定型演算法。public void radixsort i...

基數排序(桶排序)

思想 先把這組資料的個位排有序,再把十位排有序,再排百位 千位 include include include include void showarr int arr,int len printf n int getmaxnumfin int arr,int len 找陣列中最大數,並求出最大數的...

基數排序 桶排序

1.基數排序又稱桶排序,具體思想就是將數值當成陣列的下標儲存。2.將所有數值拿出個位來比較,例如值為m的就存入下標為m的陣列中。3.將比較後的陣列拿出即為按個位排序好的陣列,再將這個排序好的陣列按十位排序。4.比較完個十百千所有位數以後即排序完成。兩種 實現思路都是一樣的,實現方式1可直接改寫為c或...