基数排序队列实际上是对基数排序的一种优化,主要体现的是使用队列先进先出的思想对桶中的数据进行排序,它是通过多次的“分配”和“收集”来完成的。
代码展示
package demo01;
public class MyQueue {
int[] elements;
public MyQueue() {
elements = new int[0];
}
//入队
public void add(int element) {
//创建一个新的数组
int[] newArr = new int[elements.length+1];
//把原数组中的元素复制到新数组中
for (int i = 0; i < elements.length; i++) {
newArr[i] = elements[i];
}
//把添加的元素放入新数组中
newArr[elements.length] = element;
//替换数组
elements = newArr;
}
//出队
public int poll() {
//把数组中的第0个元素取出来
int element = elements[0];
//创建一个新的数组
int[] newArr = new int[elements.length - 1];
//复制原数组中的元素到新数组中
for (int i = 0; i < newArr.length; i++) {
newArr[i] = elements[i+1];
}
//替换数组
elements = newArr;
return element;
}
//判断队列是否为空
public boolean isEmpty(){
return elements.length == 0;
}
}
package demo4;
import demo01.MyQueue;
import java.util.Arrays;
public class RadixQueueSort {
public static void main(String[] args) {
int[] arr = new int[]{23,6,189,45,9,287,56,1,798,34,65,652,5,1024};
radixSort(arr);
System.out.println(Arrays.toString(arr));
}
public static void radixSort(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 = new MyQueue[10];
//为队列数组赋值
for(int i=0;i<temp.length;i++){
temp[i] = new MyQueue();
}
//根据最大长度的数决定比较的次数
for(int i=0,n=1;i<maxLength;i++,n*=10){
//把每一个数分别计算余数
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++;
}
}
}
}
}