基数排序@TOC
核心思想
基数排序是桶排序的发展,是一个非比较型整数排序的算法(但由于整数也可以表达字符串,因此基数排序不只可以用于整数的排序)。排序方法是按位将整数分割进行排序,按每个位分别进行比较。适用于大范围数据排序。
基数排序流程图解(升序序列)
C++语言代码展示
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
int Digit(int num) { // 求一个数是几位
int k = 0;
while (num != 0) {
num /= 10;
k++;
}
return k;
}
void RadixSort(int* a, int len) {
// 求最大值。
int maxNum = 0, i, j, n, m;
for (i = 0; i < 8; i++)
if (a[i] > maxNum) maxNum = a[i];
// 得到位数最多的元素的位数长度是多少
int k = Digit(maxNum);
int num, Y = 1;
for (i = 1; i <= k; i++) {
// 定义一个桶,编号为0~9的桶(注意第一维为10不变),局部变量,每一趟排序重建,初始全为0
int bucket[10][100] = { 0 };
for (j = 0; j < 8; j++) {
num = a[j] / Y % 10;
//bucket对应下标桶的第一个元素是该桶内有多少元素,每存一个元素,bucket[num[0]++
//自加后的位置正好是存放元素的位置
bucket[num][++bucket[num][0]] = a[j];
}
int a_len = 0;
// 把bucket拿出来放到a里
for (n = 0; n < 10; n++)
for (m = 1; m <= bucket[n][0]; m++)
a[a_len++] = bucket[n][m];
// 输出这趟排序后a内元素情况
for (int i = 0; i < len; i++)
cout << a[i] << " ";
cout << endl;
Y *= 10;
}
}
int main() {
// 注意,该代码只写了对正整数排序的情况,如果待排序元素有负数,会越界报错
int a[9] = { 5759, 45, 14, 60, 3, 81, 22, 97590 };
RadixSort(a, 8);
return 0;
}
基数排序适合范围
①数据元素的关键字可以方便的拆分为d组,且d比较小
②每组关键字的取值范围不大,即r比较少
③数据元素个数n较大
时空复杂度
时间复杂度
O(d(n+r))
空间复杂度 O( r )
参考视频,视频讲解基础算法-排序算法-基数排序(图解+代码)