轉載請註明出處:http://blog.csdn.net/ljmingcom304/article/details/50372591
本文出自:【梁敬明的博客】
1.基數排序
基數排序又稱作桶排序,從序列的最低位開始,把當前位數對應的數字按0~9將元素進行歸類,遍歷到元素中不爲0的最高位爲止,直到最終完成排序。
存在一個序列【19】【82】【137】【22】【5】【431】【23】【20】【11】【109】,將其按照從小到大的順序進行排列。
第一次分類,選取元素的個位數,按0~9將元素進行歸類。
第二次分類,選取元素的十位數,按0~9將元素進行歸類。
第三次分類,選取元素的百位數,按0~9將元素進行歸類。
2.示例代碼
對一個長度爲N的序列從小到大進行排序,序列中元素的不爲0的最高位爲第i位,從第1位開始,將0~9存放到二維數組的第一維,再將序列中當前位的元素與第一維對應,存放到二維數組的第二維,按該存放方式到元素的最高位爲止。
public class RadixSort {
public static void main(String[] args) {
int[] array = { 19, 82, 137, 22, 5, 431, 23, 20, 11, 109 };
RadixSort.sort(array);
System.out.println("排序後數組:" + Arrays.toString(array));
}
public static void sort(int[] a) {
int digit = 0;// 數組的最大位數
for (int i : a) {
// 獲取數組中數的最大位數
digit = Math.max(digit, String.valueOf(i).length());
}
int k = 0;// 用戶記錄排序數組的索引
int m = 1;// 當前的位數,個位用1表示,十位用2表示,以此類推
int n = 1;// 用來表示當前位數的整數倍
int type = 10;// 將餘數從0-9分爲10種類型
int[][] temp = new int[type][a.length];// 第一維用來存儲餘數,第二維用來存儲餘數對應的數組值
int[] order = new int[type];// 用戶第二維數組值得索引計數
while (m <= digit) {
// 遍歷數組中的每個元素,以當前位數依據餘數進行歸類
for (int i = 0; i < a.length; i++) {
int r = (a[i] / n) % 10;// 當前數值在當前位數的餘數
temp[r][order[r]] = a[i];// 第一次爲temp[r][0],第二次爲temp[r][1]......
order[r]++;
}
// 遍歷二維數組的第一維
for (int i = 0; i < type; i++) {
if (order[i] != 0) {// 當order[i]==0時,說明order[r]++沒有執行,temp[r][]中沒有存儲數組值
// 遍歷二維數組的第二維
for (int j = 0; j < order[i]; j++) {// order[i]表示當前i餘數的類型存儲的數組值的個數
a[k] = temp[i][j];
k++;
}
}
order[i] = 0;
}
k = 0;// 排序數組索引初始化
m++;// 當前位數個數的索引
n *= 10;// 當前位數向前推
}
}
}
3.算法分析
時間複雜度:
待排序列有n個元素,所有元素的最大位數爲d(如最大位數爲百分位,則d=3),r爲當前位數的取值範圍(如0~9),基數排序的時間複雜度爲
算法穩定性:
在基數排序中,當前位數相同的數值不會交換位置,所以基數排序是穩定的排序算法。