基本思想:將所有待比較數值(正整數)統一為同樣的數字長度,數字較短的數前面補零。然後,從最低位開始,依次進行一次排序。這樣從最低位排序一直到最高位排序完成以後,數列就變成乙個有序序列。
複雜度和穩定性情況:
演算法步驟:
基數排序的方式可以採用 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或...