package chaper05;
import java.util.Arrays;
public class ArrayTest6 {
public static void main(String[] args) {
int[] arr = {1232,889,7789,8,990,78,8,6,6443456,8,11};
radixSort(arr);
System.out.println(Arrays.toString(arr));
}
//基数排序 不基于比较的排序 一种特殊的状态 十进制的数
public static void radixSort(int[] arr){
if (null == arr || arr.length < 2){
return;
}
radixSort(arr,0,arr.length-1,maxBits(arr));
}
/**
*
* @param arr 数组
* @return 返回数组中最大值的位数 数组的最大位数
*/
public static int maxBits(int[] arr){
int max=Integer.MIN_VALUE;
for (int i = 0; i < arr.length-1 ;i++) {
max = Math.max(max,arr[i]);
}
int result = 0;
while (max != 0) {
result++;
max /= 10;
}
return result;
}
/**
*
* @param arr 数组
* @param left 开始下标
* @param right 结束下标
* @param maxBits 数组位数
*/
private static void radixSort(int[] arr, int left, int right, int maxBits) {
final int radix = 10; //桶子的个数
int i = 0,j = 0;
int[] help = new int[right - left + 1]; //辅助数组的长度等于原数组的长度
for (int b = 1; b <= maxBits; b++) { //出桶进桶的次数 b就是当前位 1代表个位 2十位 3百位.....
int[] count = new int[radix]; //累计出个位相同的有多少位
for (i=left;i <= right; i++){
j = getDigit(arr[i],b);
count[j]++;
}
for (i = 1 ;i <radix;i++){
count[i]=count[i]+count[i-1]; //分片 当前值加上前一个的值 每个值代表的是<=该值的有几个数
}
for (i = right;i >= left;i--){ //逆序输出 权位原因
j = getDigit(arr[i],b);
help[count[j]-1]= arr[i];// count[j]-1 减一很关键
count[j]--;
}
//到这表示入桶出桶一次
for (i=left,j=0;i<=right;i++,j++){
arr[i]=help[j];
}
}
}
/**
*
* @param i 数
* @param b 位 1表示个位 2表示十位 .....
* @return 返回一个数当前位对应的值
*/
private static int getDigit(int i, int b) {
return (i/((int)(Math.pow(10,b-1))) % 10);
}
}