/*
* 基数排序(桶排序)思路:
* 根据单个数的位长,决定排序轮数
* 第一次排序,跟每个数的个位排序,如有10个桶,0-9号,按照号数排序,然后依次按桶号顺序重新放如数列
* 接着按十百千上去,前面位数不足就补0
*
*
* 空间换时间的经典算法
* */
import java.util.Arrays;
public class RadixSort {
public static void main(String[] args) {
int [] arr = {53,3,542,748,14,214};
}
public static void radixSort(int[] arr){
int max = arr[0];//假设是最大数
for (int i = 0; i < arr.length; i++) {
max = arr[i];
}
//需得到最大数是几位数
int maxLength = (max+" ").length();
//技术排序方法
//定义一个二维数组,表示10个通,每个通就是一个一维数组
//1.二维数组包含10个一维数组
//2.位了防止放入数的时候,数据溢出,则每个一维数组大小定为arr.alength
int [] [] bucket = new int [10][arr.length];
//记录每个桶存放多少个数据,定义一个一维数据记录各个桶放入的数据
//bucketElementCounts[0],记录0桶每次放入的数据
int [] bucketElementCounts = new int [10];
for (int i = 0,n = 1; i < maxLength; i++,n*=10) {
for (int j = 0; j < arr.length ;j++) {
//取出每个元素的个数
int digitOfElement = arr[j] / n % 10;
bucket[digitOfElement][bucketElementCounts[digitOfElement]]= arr[j];
bucketElementCounts[digitOfElement]++;
}
//按这个顺序放入数列
int index = 0;
//遍历没一个桶,
for (int k = 0; k < bucketElementCounts.length; k++) {
if(bucketElementCounts[k] !=0){
for (int l =0;l<bucketElementCounts[k];l++){
//取出元素放入arr
arr[index++] = bucket[k][l];
}
}
//第一轮处理后,需将bucketElementCounts[k] = 0!!!!
bucketElementCounts[k] = 0;
}
System.out.println("第"+i+i+"轮的arr:"+Arrays.toString(arr));
}
}
}