用空間換時間,他用一個二維數組(10*n)和一位數組(1*10),用於排序的道具,該排序不是依據的傳統的比較的思想,她是採用,先讓所有元素按照個位的數字,放在二維數組中(二維數組中,第一維:個位、十位、百位...,第二位用於盛放數據:一個數據、兩個數據...),然後以爲數組記錄每個個位數組裏數據的數量,然後再將二維數組中的數據,依據從小到大的順序拿出來,這個新組成的數據,就是第一輪排序後的結果。
以此類推,完成十位、百位的排序...
package Sort;
import java.util.Arrays;
public class RadixSort {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr = {34,12,890,443,789,32,18,90};
RadixSort radixSort = new RadixSort();
radixSort.Radix(arr);
System.out.println(Arrays.toString(arr));
}
//基數排序:用空間換時間
//思路:
//1、首先找到數組中元素位數最多的那一位,看看他有幾位組成,就遍歷幾次
//2、生成一個10*n的二維數組,大小和arr.length一樣。在生成個一維數組,用於記錄每個每個桶裏有幾個元素
//3、開始遍歷,先從各個元素的個位開始遍歷,從小到大放在數組中,放入後,在依次取出來,這就完成了一次遍歷
//4、然後繼續遍歷,直到遍歷完。
public void Radix(int[] arr) {
if(arr.length == 0) {
return;
}
//定義一個二維數組,用於存放數組
int[][] arr2 = new int[10][arr.length];
//定義一個一維數組,用於計數
int[] arr1 = new int[10];
int max = 0;//最大元素
for(int i = 0; i < arr.length; i++) {
if(max < arr[i]) {
max = arr[i];
}
}
//看最大元素有幾位數組成
max = (max +"").length();//比如345,那麼max = 3
int temp;
int index;
//遍歷max次,
for(int i = 0 ,n = 1; i < max; i++ , n *= 10) {
//n:用於取個位、十位、百位...放入arr2中
for(int j = 0; j < arr.length; j++) {
temp = arr[j] / n % 10;
arr2[temp][arr1[temp]++] = arr[j];
}
index = 0;
//將arr2元素取出來,重新合在一起
for(int k = 0; k < 10; k++) {
if(arr1[k] != 0) {
for(int m = 0;m < arr1[k]; m++) {
arr[index++] = arr2[k][m];
}
}
arr1[k] = 0;
}
}
}
}