基數排序原理:
判斷每個數的個位、十位、百位…
然後分別放到對應的桶中(這裏的桶一共有10個,分別是{0,1,2,3,4,5,6,7,8,9} 個位如果是1就放到1的桶中),每判斷完一位,將數據按順序(就是從小到大)取出,然後每一位都是這樣,上圖:
數據爲arr={53, 3, 542, 748, 14, 214}
第一輪:
第二輪:
第三輪:
三輪代碼:
public static void radixSort(int[] arr) {
//爲了防止數據溢出大小定義爲arr.length
//明確空間換時間
int[][] bucket = new int[10][arr.length];
//bucketElementCount[0]就是 bucket[0]桶放入數據的個數
int[] bucketElementCount = new int[10];
//針對每個元素放到每個元素的桶中
for (int j = 0; j < arr.length; j++) {
int digitOfElement = arr[j] % 10;
//放在對應的桶中
bucket[digitOfElement][bucketElementCount[digitOfElement]] = arr[j];
bucketElementCount[digitOfElement]++;
}
int index = 0;
for (int k = 0; k < bucketElementCount.length; k++) {
//如果桶中有數據,我們才放到原數組
if (bucketElementCount[k] != 0) {
//循環該桶
for (int l = 0; l < bucketElementCount[k]; l++) {
arr[index++] = bucket[k][l];
}
}
bucketElementCount[k] = 0;
}
System.out.println(Arrays.toString(arr));
//=====================第二輪=======================
//針對每個元素放到每個元素的桶中
for (int j = 0; j < arr.length; j++) {
int digitOfElement = arr[j] /10 % 10;
//放在對應的桶中
bucket[digitOfElement][bucketElementCount[digitOfElement]] = arr[j];
bucketElementCount[digitOfElement]++;
}
index = 0;
for (int k = 0; k < bucketElementCount.length; k++) {
//如果桶中有數據,我們才放到原數組
if (bucketElementCount[k] != 0) {
//循環該桶
for (int l = 0; l < bucketElementCount[k]; l++) {
arr[index++] = bucket[k][l];
}
}
bucketElementCount[k] = 0;
}
System.out.println(Arrays.toString(arr));
//=====================第三輪=======================
//針對每個元素放到每個元素的桶中
for (int j = 0; j < arr.length; j++) {
int digitOfElement = arr[j] /100 % 10;
//放在對應的桶中
bucket[digitOfElement][bucketElementCount[digitOfElement]] = arr[j];
bucketElementCount[digitOfElement]++;
}
index = 0;
for (int k = 0; k < bucketElementCount.length; k++) {
//如果桶中有數據,我們才放到原數組
if (bucketElementCount[k] != 0) {
//循環該桶
for (int l = 0; l < bucketElementCount[k]; l++) {
arr[index++] = bucket[k][l];
}
}
bucketElementCount[k] = 0;
}
System.out.println(Arrays.toString(arr));
}
運行結果:
結果和圖一樣但是代碼比較繁瑣,只有取位數是不一樣,我們可以優化。
優化後:
public static void radixSort(int[] arr) {
//最大值
int max = arr[0];
for (int i = 0; i <arr.length; i++) {
if (arr[i] > max){
max = arr[i];
}
}
//爲了防止數據溢出大小定義爲arr.length
//明確空間換時間
int[][] bucket = new int[10][arr.length];
//bucketElementCount[0]就是 bucket[0]桶放入數據的個數
int[] bucketElementCount = new int[10];
int maxLength = ("" + max).length();
for (int ml = 0, n = 1; ml < maxLength; ml++, n *= 10){
//針對每個元素放到每個元素的桶中
for (int j = 0; j < arr.length; j++) {
int digitOfElement = arr[j] / n % 10;
//放在對應的桶中
bucket[digitOfElement][bucketElementCount[digitOfElement]] = arr[j];
bucketElementCount[digitOfElement]++;
}
int index = 0;
for (int k = 0; k < bucketElementCount.length; k++) {
//如果桶中有數據,我們才放到原數組
if (bucketElementCount[k] != 0) {
//循環該桶
for (int l = 0; l < bucketElementCount[k]; l++) {
arr[index++] = bucket[k][l];
}
}
bucketElementCount[k] = 0;
}
System.out.println(Arrays.toString(arr));
}
}
基數排序80000數據測試80mm左右(根據個人電腦速度不一)