基數排序思想:
將所有待比較數值統一爲同樣待數位長度,數位長度較短短數值前面加0, 然後從個位開始,依次將數放入個位數上對應的桶,放完數據後,又從桶中拿出數據。接着是十位數,分別求出每一個待排序數的十位,將此數放入十位對應的桶內,放完所有數後,又依次從桶中拿出數據。。。直至完成最大位數。桶排序需要預先分配10倍的原數組大小,並且其對小數、負數支持不好。
代碼:
public class BaseSort {
public static void main(String[] args) {
int len = 800000;
int[] a = new int[len];
for ( int i = 0; i < len; i++) {
a[i] = (int)(Math.random()*200000000);
}
int cnt = sort(a);
System.out.printf("數組長度爲:%d\n", a.length);
//System.out.println(Arrays.toString(a));
}
public static int sort(int[] a) {
int stepCnt = 0;
//第一輪:針對每個元素的個位進行排序處理
//定義一個二維數組,表示10個桶,每個桶就是一個一維數組
//二維數組包含10個一維數組
//爲了防止在放入數的時候,數據溢出,則每個一維數組(桶),大小定位arr.length
//基數排序是空間換事件的經典案例
int[][] bucket = new int[10][a.length];
//爲了記錄每個桶中,實際存放了多少個數據,定義一個一維數組來記錄各個桶每次放入的數據個數
//bucketElementCnt[0] 記錄的是bucket[0]每次放入的數據的個數
int maxBit = a[0];
for (int i = 1; i < a.length; i++) {
if (a[i] > maxBit) {
maxBit =a [i];
}
}
int maxLength = (maxBit+"").length();
int[] bucketElementCnt = new int[10];
for (int i = 0, n = 1; i < maxLength; i++, n *= 10) {
//對每個元素的個位進行排序處理
for (int j = 0; j < a.length; j++) {
//取出每個元素的個位值
int digitOfEle = a[j] / n % 10;
//放入到對應的桶中
bucket[digitOfEle][bucketElementCnt[digitOfEle]] = a[j];
bucketElementCnt[digitOfEle]++;
}
//按照桶的順序,依次取出桶內的數據
int index = 0;
//遍歷每一個桶,並將桶中的數據放入到原數組中
for (int k = 0; k < bucketElementCnt.length; k++) {
if (bucketElementCnt[k] > 0) {
for (int l = 0; l < bucketElementCnt[k]; l++) {
//取出所有元素放入到原array中
a[index] = bucket[k][l];
index++;
}
}
bucketElementCnt[k] = 0;
}
}
return stepCnt;
}
}