欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

使用队列实现基数排序

程序员文章站 2022-04-05 19:45:22
...

基数排序:
排序方法:
第一步:设原来数组如下所示:2, 225,25,36,12,99,2,1,5, 5563, 12251
第二步:首先根据个位数的数值,遍历将它们分配至编号0到9的队列中
第三步:接下来将这些队列中的数值按先进先出的顺序重新串接起来。
第四步:持续进行第2,3步的动作直至最高位数为止,数组最终有序

public class RadixSort {

  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 = Integer.toString(max).length();
        //定义10个临时队列,0~9各一个,可以在菜鸟教程学习到如何使用linkedlist实现队列
        Queue[] temp = new Queue[10];
        for (int i = 0; i < temp.length; i++) {
            temp[i] = new LinkedList<Integer>();
        }

        //根据最大位数,决定比较次数,第一次取数的个位比较排序,第二取数的十位比较排序,第三次取数的百位比较排序,以此类推
        for (int i = 0, n = 1; i < maxlength; i++, n *= 10) {
            //按每一个数字的当前位的大小进行排序
            for (int j = 0; j < arr.length; j++) {
                //求模得到数的个位,十位,百位的值
                int num = arr[j] / n % 10;
                //放入对应的临时队列
                temp[num].offer(arr[j]);
            }
            //该索引用于更新arr数组
            int index = 0;
            //再把每个队列的数字取出来
            for (int k = 0; k < temp.length; k++) {
                //当前遍历的队列不为空
                while (!temp[k].isEmpty()) {
                    arr[index] = (int) temp[k].poll();
                    index++;
                }
            }


        }
    }
}

测试:

public static void main(String[] args) {
    int arr[] = {2, 225,25,36,12,99,2,1,5, 5563, 12251};
     radixSort(arr);
    System.out.println(Arrays.toString(arr));
}

基数排序图解:
使用队列实现基数排序
使用队列实现基数排序
以此类推直到按最大数的位数排好序:
使用队列实现基数排序

相关标签: 排序算法