使用队列实现基数排序

基数排序:
排序方法:
第一步:设原来数组如下所示: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));
}

基数排序图解:
在这里插入图片描述
在这里插入图片描述
以此类推直到按最大数的位数排好序:
在这里插入图片描述

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C++中,我们可以利用队列实现链式基数排序。这里介绍一个利用STL中的队列实现链式基数排序的方法。 ```cpp #include <iostream> #include <queue> #include <cmath> using namespace std; // 获取一个数字的某一位数字 int getDigit(int number, int digit) { return (number / static_cast<int>(pow(10, digit - 1))) % 10; } // 链式基数排序 void radixSort(int arr[], int size, int digit) { // 创建 10 个桶 queue<int> bucket[10]; // 按照每一位数字进行排序 for (int i = 1; i <= digit; i++) { // 把数据放入桶中 for (int j = 0; j < size; j++) { int num = getDigit(arr[j], i); bucket[num].push(arr[j]); } // 把桶中的数据放回原数组中 int index = 0; for (int j = 0; j < 10; j++) { while (!bucket[j].empty()) { arr[index++] = bucket[j].front(); bucket[j].pop(); } } } } int main() { int arr[] = {170, 45, 75, 90, 802, 24, 2, 66}; int size = sizeof(arr) / sizeof(arr[0]); radixSort(arr, size, 3); for (int i = 0; i < size; i++) { cout << arr[i] << " "; } cout << endl; return 0; } ``` 在代码中,我们首先定义了一个 `getDigit` 函数,用于获取一个数字的某一位数字。然后定义了 `radixSort` 函数,用于进行链式基数排序。在函数中,我们首先创建了 10 个桶,然后按照每一位数字进行排序,具体实现方法是把数据放入相应的桶中,然后把桶中的数据放回原数组中。最后,在 `main` 函数中,我们创建了一个数组 `arr`,并调用 `radixSort` 函数进行排序。最后输出排序后的结果。 需要注意的是,这里我们只引入了队列的库,而没有引入链表等其他库,因为队列是链表的一种特殊形式,可以用来实现链式存储。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值