算法思想:
基數(shù)排序(radix sort)屬于“分配式排序”(distribution sort),又稱“桶子法”(bucket sort)或bin sort,
它是透過鍵值的各個(gè)位的值,將要排序的元素分配至某些“桶”中,藉以達(dá)到排序的作用, 屬于穩(wěn)定性排序
理解:
初始10個(gè)桶對應(yīng)標(biāo)號 0-9,
第一次將每個(gè)元素按照個(gè)位放入對應(yīng)下標(biāo)的桶中;
將按照個(gè)位拍好序列的元素依次放入arr中(此時(shí)個(gè)位排好序了,而且如果只有1位,從0-9的這些數(shù)已經(jīng)是有序序列了)
在新的arr中,第二次將每個(gè)元素的十位放入對應(yīng)下標(biāo)的桶中; (在個(gè)位已經(jīng)拍好序的基礎(chǔ)上,對十位也排好序)
(只有兩位的話:如果十位不同,則放入不同的桶,直接能排好序了;如果十位相同,而個(gè)位是已經(jīng)排好序的,也能對任何的兩位數(shù)排好序)
依次類推。。。
public class RadixSorting {
public static void radixSort(int[] arr){
// 找出arr中最大的元素
int maxElement = getMaxElement(arr);
// 獲取maxElement的length
int lenthForMaxElement = getMaxElementLen(maxElement);
//二維數(shù)組表示10個(gè)桶,每個(gè)桶用一維數(shù)組表示
int[][] buckets = new int[10][arr.length];
//用來記錄每個(gè)桶所放元素的個(gè)數(shù). 比如:bucketElementsCounts[0],記錄的就是buckets[0]桶的放入數(shù)據(jù)的個(gè)數(shù)
int[] bucketElementsCount = new int[10];
for (int i = 0,n = 1; i < lenthForMaxElement; i++,n*=10) {
//比如:num = 10,按照個(gè)位放入對應(yīng)下標(biāo)的桶中;num = 100,按照十位放入對應(yīng)下標(biāo)的桶中
for (int j = 0; j < arr.length; j++) {
//取出個(gè)位/十位/百位....
int remainder = arr[j]/n % 10;
//arr[j]放入桶中
buckets[remainder][bucketElementsCount[remainder]] = arr[j];
//元素個(gè)數(shù)+1
bucketElementsCount[remainder]++;
}
//一輪放完后,按照桶的順序(一維數(shù)組的下標(biāo)依次取出數(shù)據(jù)放入原數(shù)組)
int index = 0;
//遍歷每一個(gè)桶,并將桶中的數(shù)據(jù)放入原數(shù)組
for (int k = 0; k < bucketElementsCount.length; k++) {
//桶中有數(shù)據(jù)才放入數(shù)組
if (bucketElementsCount[k] != 0) {
for (int l = 0; l < bucketElementsCount[k]; l++) {
arr[index] = buckets[k][l];
index++;
}
}
//每一輪處理后都需要將 bucketElementsCount[k] = 0,用于下一輪桶中數(shù)據(jù)被覆蓋?。?!
bucketElementsCount[k] = 0;
}
}
}
public static void main(String[] args) {
int[] arr = {101,34,39,1,305,1,90,123};
radixSort(arr);
System.out.println(Arrays.toString(arr));
}
private static int getMaxElement(int[] arr) {
int max = arr[0];
for (int i = 1; i < arr.length; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
return max;
}
private static int getMaxElementLen(int maxElement) {
int temp = maxElement;
int counter=0;
while (temp >0) {
temp /=10;
counter++;
}
return counter;
}
}

用于輔助理解 - 第一輪排序

用于輔助理解 - 第二輪排序