packagemain.java.com.LiKou.arithmetic;importmain.java.com.LiKou.queue.MyQueue;importjava.util.Arrays;/**
* 将基数排序用队列优化
*/publicclassRadixSortPlus{publicstaticvoidmain(String[] args){int[] arr =newint[]{32,21,1,7,890,784,23,5,78,33,89,98,54,33,34,54,53,998,32,21,1,7,890,784,23,5,78,33,89,98,54,33,34,54,53,998,32,21,1,7,890,784,23,5,78,33,89,98,54,33,34,54,53,998};redixSort(arr);System.out.println(Arrays.toString(arr));}publicstaticvoidredixSort(int[] arr){//存数组中最大的数字int max =Integer.MIN_VALUE;for(int i =0; i < arr.length; i++){if(arr[i]> max){
max = arr[i];}}//计算最大数字是几位数int maxLength =(max +"").length();//数字+""就变成了字符串,就可以使用字符串的相应方法了//用于临时存储数据的队列数组MyQueue[] temp =newMyQueue[10];//为队列数组赋值,不然会报空指针异常for(int i =0; i < temp.length; i++){
temp[i]=newMyQueue();}//根据最大长度的数来决定比较的次数for(int i =0, n =1; i < maxLength; i++, n*=10){//n用来求每轮对应的位数//把每一个数字分别计算余数for(int j =0; j < arr.length; j++){//计算余数int ys = arr[j]/ n %10;//把当前遍历的数据放入指定的队列中
temp[ys].add(arr[j]);}//记录取得元素需要放的位置int index =0;//把所有队列中的数字取出来for(int k =0; k < temp.length; k++){//当前遍历的队列不为空的时候,循环取while(!temp[k].isEmpty()){//取出元素
arr[index]= temp[k].poll();//记录下一个元素
index++;}}}}}