• 基数排序的简单理解


    详细描述

    从基数排序的描述可以看得出,其适用于整数,但是,整数也可以表达字符串(比如名字或时间)和特定格式的浮点数,因此基数排序并不只是适用于整数。

    基数排序详细的执行步骤如下:

    1. 首先准备 10 个桶,分别用于存储所在位数为 0 ~ 9 的数;
    2. 提取出序列中元素的个位,将该元素移动到对应个位所属的桶内;
    3. 重复执行第 2 步,从个位、十位、百位直到最大元素的最大位数,没有所在位时赋为 0;
    4. 执行完第 3 步,组合每个桶内的元素成有序序列。

    算法图解

    基数排序

    问题解疑

    基数排序的复杂度是多少?

    基数排序的时间复杂度和待排序序列的最大位数有关系,由于需要对每一个位数遍历一次序列,基数排序的时间复杂度是 O(n×k),其中 k 是最大位数。

    基数排序的空间复杂度是 O(n+k),其中 k 是桶的数量。

    基数排序和快速排序哪个效率更好?

    基数排序是一种空间换时间的非比较类排序算法,其时间复杂度是 O(n×k);快速排序是一种常规的比较类排序算法,其时间复杂度是 O(nlog2n)

    从时间复杂度上看,主要在于其系数的比较。通常是,待排序序列的最大位数越大, 基数排序的效率就越低,这时选择快速排序则更优;如果数据量非常大的时候,则基数排序比较占优。

    代码实现

    排序抽象类

    package cn.fatedeity.algorithm.sort;
    /**
    * 排序抽象类
    */
    public abstract class Sort {
    protected void swap(int[] numbers, int src, int target) {
    int temp = numbers[src];
    numbers[src] = numbers[target];
    numbers[target] = temp;
    }
    public abstract int[] sort(int[] numbers);
    }

    计数排序类

    package cn.fatedeity.algorithm.sort;
    import java.util.List;
    import java.util.ArrayList;
    /**
    * 计数排序算法类
    */
    public class RadixSort extends Sort {
    public int[] sort(int[] numbers) {
    if (numbers.length == 0) {
    return numbers;
    }
    int min = numbers[0], max = numbers[0];
    for (int number : numbers) {
    if (number < min) {
    min = number;
    }
    if (number > max) {
    max = number;
    }
    }
    int k = String.valueOf(Math.max(Math.abs(min), Math.abs(max))).length();
    List<List<Integer>> buckets = new ArrayList<>();
    for (int i = 0; i < 19; i++) {
    buckets.add(new ArrayList<>());
    }
    int x = 1;
    while (x <= k) {
    for (int number : numbers) {
    int index = (number / (int) Math.pow(10, x - 1)) % 10;
    List<Integer> bucket = buckets.get(index + 9);
    bucket.add(number);
    }
    int index = 0;
    for (int i = 0; i < buckets.size(); i++) {
    for (int number : buckets.get(i)) {
    numbers[index++] = number;
    }
    buckets.set(i, new ArrayList<>());
    }
    x++;
    }
    return numbers;
    }
    }
    折叠
  • 相关阅读:
    面向跨模态匹配的噪声关联学习
    如何通过WinDbg获取方法参数值
    [开发过程]<c#上位机>关于.net6
    【USRP】软件无线电基础篇:美国完整的军用通信系统
    再度盈利后提“冷静增长”,爱奇艺守住长视频初心
    武汉某厂前端中高级面试题一面
    K_A01_001 基于单片机驱动WS2812 点灯流水灯 0-9显示
    私有化部署AI智能客服,解放企业成本,提升服务效率
    高并发分布式架构演进
    R语言时间序列数据的平滑:使用KernSmooth包的dpill函数和locpoly函数对时间序列数据进行平滑以消除噪声
  • 原文地址:https://www.cnblogs.com/fatedeity/p/16437619.html