排序演算法 八 基數排序

2021-08-08 09:28:35 字數 1458 閱讀 3327

基數排序不需要直接比較數值的大小和直接在序列中交換資料,這個其他的排序演算法有很大的不同,它是根據數字中各位的值,通過對其進行分配收集來實現排序的。基數排序的原理很簡單易懂,下面給出乙個示例應該就能理解了。

對於[29, 9, 14, 87, 92, 199, 283, 183, 65, 43, 6 ,3]這個序列進行lsd基數排序:

計算出這個序列中最大數的位數,可知是283,位數為3

建立乙個10列n行的二維陣列,n為待排序列長度,

接著遍歷陣列,並計算出第i位(i初始化為1)的值,放入對應的二維陣列中,如下圖

從0~9的順序直接重寫原陣列,結果為[92, 283, 183, 43, 3, 14, 65, 6, 87, 29, 9, 199],

i = i + 1,計算高一位,重複2,3,4步,直到i == 3 0

12923

283183433

414565

66787

89299

199

其實基數排序有點類似於桶排序的優化版本,只不過不再受限於數字的最大值。只需要10 * n的輔助空間即可。

@override

public

int sort(int data)

int length = data.length;

int maxnumber = integer.min_value;

//找到最大數

for (int i = 0; i < length; i++)

}int maxdigit = 0;

//計算出最大數的位數

while (maxnumber != 0)

//記錄資料

int bucket = new

int[10][length];

//記錄每個基數的存在記錄數量

int order = new

int[10];

int digit = 1;

while (digit <= maxdigit)

int datacount = 0;

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

order[i] = 0;}}

system.out.print("after ");

printlnarray(data);

system.out.println(string.format(locale.china, "digit %d round finish", digit));

digit++;

}return data;

}

具體實現可檢視

github/radixsort

看起來**量很多,但是個人感覺理解起來還是比較容易的。

基數排序是乙個穩定的排序方式,最壞,最好,平均的時間複雜度都為o(nlogn)。但是需要乙個 o(n + r)的輔助空間,如果是數字排序,r一般為10。

排序演算法 基數排序

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

排序演算法 基數排序

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

排序演算法 基數排序

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