基数排序
基数排序的本质实则是桶排序,对每一位基位数进行一次排序
例如:
基数排序中,我们将借助链表来当作桶
其中需要说明的内容,在代码中写好注释:
#include <iostream>
#include <list> // 使用C++ 封装好的模板类
#include <algorithm> // 算法库
using namespace std;
int MaxNum(int* arr, int n)
{
initializer_list<int> i_list(arr, arr + n - 1); // 将数组元素放入到一个列表中
int Max = max(i_list); // 调用 算法库中的 max 求出最大值
int count = 0;
while(Max > 0) // 求出最大值是几位数 用于对数进行几次桶排序
{
count++;
Max /= 10;
}
return count;
}
void RadixSort(int* arr, int n) // 基数排序
{
int idigit = MaxNum(arr, n);
list<int> myList[10]; // 10 个链表 10个桶
for(int i = 0, k = 1; i < idigit; k *= 10, i++) // k 用来控制取第几位数
{
// 将数组中的元素放入桶中
for(int j = 0; j < n; j++)
{
myList[(arr[j] / k) % 10].push_back(arr[j]); // 根据值放入对应的桶中
}
// 将桶中的元素放回数组中
for(int j = 0, m = 0; j < n; j++)
{
while(!myList[j].empty())
{
arr[m++] = myList[j].front(); // 取每个桶的第一个元素 按顺序来很重要
myList[j].pop_front(); // 取出第一个桶后,删除第一个元素
}
}
}
}
int main()
{
int arr[]{102, 504, 523, 645, 872, 622, 123, 754, 888, 131};
int nSize = sizeof(arr) / sizeof(arr[0]);
RadixSort(arr, nSize);
for(auto i : arr)
{
cout << i << " ";
}
cout << endl;
return 0;
}
运行结果为:
102 123 131 504 523 622 645 754 872 888
基数排序浪费了点内存,但在速度上绝对提高了不少
^ _ ^
来源:CSDN
作者:浪子花梦
链接:https://blog.csdn.net/weixin_42100963/article/details/103912878