基數排序不需要直接比較數值的大小和直接在序列中交換資料,這個其他的排序演算法有很大的不同,它是根據數字中各位的值,通過對其進行分配收集來實現排序的。基數排序的原理很簡單易懂,下面給出乙個示例應該就能理解了。
對於[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 首先將序列中的記錄按照最低位值的大小分配到各個桶中...