排序算法:基数排序算法

文章目录

一、基数排序是什么?

基数排序是一种"不比较大小"的排序算法,它按"数位"一位一位地排。这是它和冒泡 / 快排 / 归并排序本质上最大的区别。

基数排序的核心思想

以十进制整数为例:

  1. 先按个位排序
  2. 再按十位排序
  3. 再按百位排序
  4. ......

直到最高位;每一轮都是稳定排序

二、图示解析

假设数组:

cpp 复制代码
[170, 45, 75, 90, 802, 24, 2, 66]

按「个位」排序

cpp 复制代码
桶0: 170, 90
桶2: 802, 2
桶4: 24
桶5: 45, 75
桶6: 66

收集后:

cpp 复制代码
[170, 90, 802, 2, 24, 45, 75, 66]

按「十位」排序

cpp 复制代码
桶0: 802, 2
桶2: 24
桶4: 45
桶6: 66
桶7: 170, 75
桶9: 90

结果:

cpp 复制代码
[802, 2, 24, 45, 66, 170, 75, 90]

按「百位」排序

cpp 复制代码
桶0: 2, 24, 45, 66, 75, 90
桶1: 170
桶8: 802

总的来说,排序如下所示:

为什么"必须是稳定排序"?

如果低位排序打乱了高位的相对顺序;结果一定错

因此:

  • 基数排序 = 多轮稳定排序
  • 通常使用:计数排序、桶排序作为"子排序"

基数排序的优缺点

优点:

  • 不比较大小
  • 时间复杂度稳定
  • 大数据量时非常快
  • 特别适合:整数、固定长度字符串、ID / 编号

缺点:

  • 只能用于 "可拆分为位"的数据
  • 需要额外空间
  • 不适合:浮点数、比较规则复杂的对象

三、时间 & 空间复杂度分析

设:

  • n = 元素个数
  • d = 最大数字的位数
  • k = 基数(十进制 = 10)

时间复杂度:

cpp 复制代码
O(d × (n + k)) ≈ O(d × n)

线性时间排序(非常快)

空间复杂度:

cpp 复制代码
O(n + k)

四、基数排序完整示例

示例:对非负整数排序

cpp 复制代码
#include <iostream>
#include <vector>
using namespace std;

// 按某一位进行计数排序
void countingSort(vector<int>& arr, int exp)
{
    int n = arr.size();
    vector<int> output(n);
    int count[10] = {0};

    // 统计当前位出现次数
    for (int i = 0; i < n; i++)
        count[(arr[i] / exp) % 10]++;

    // 前缀和(确定位置)
    for (int i = 1; i < 10; i++)
        count[i] += count[i - 1];

    // 从后往前保证稳定性
    for (int i = n - 1; i >= 0; i--)
    {
        int digit = (arr[i] / exp) % 10;
        output[count[digit] - 1] = arr[i];
        count[digit]--;
    }

    arr = output;
}

// 基数排序
void radixSort(vector<int>& arr)
{
    int maxVal = *max_element(arr.begin(), arr.end());

    for (int exp = 1; maxVal / exp > 0; exp *= 10)
        countingSort(arr, exp);
}

int main()
{
    vector<int> arr = {170, 45, 75, 90, 802, 24, 2, 66};

    radixSort(arr);

    for (int x : arr)
        cout << x << " ";
}
相关推荐
YuTaoShao2 小时前
【LeetCode 每日一题】1653. 使字符串平衡的最少删除次数——(解法一)前后缀分解
算法·leetcode·职场和发展
VT.馒头2 小时前
【力扣】2727. 判断对象是否为空
javascript·数据结构·算法·leetcode·职场和发展
goodluckyaa2 小时前
LCR 006. 两数之和 II - 输入有序数组
算法
孤狼warrior2 小时前
YOLO目标检测 一千字解析yolo最初的摸样 模型下载,数据集构建及模型训练代码
人工智能·python·深度学习·算法·yolo·目标检测·目标跟踪
Σίσυφος19003 小时前
PCL法向量估计 之 RANSAC 平面估计法向量
算法·机器学习·平面
xhbaitxl3 小时前
算法学习day39-动态规划
学习·算法·动态规划
I_LPL3 小时前
day23 代码随想录算法训练营 回溯专题2
算法·hot100·回溯算法·求职面试
智者知已应修善业3 小时前
【洛谷P9975奶牛被病毒传染最少数量推导,导出多样例】2025-2-26
c语言·c++·经验分享·笔记·算法·推荐算法
m0_736919103 小时前
C++中的委托构造函数
开发语言·c++·算法
小小小小王王王3 小时前
洛谷-P1886 【模板】单调队列 / 滑动窗口
c++·算法