基本思想:桶排序的改进版, 申请的桶的内存大小固定为10,减少内存开销;
因为是十进制,所以每一个数值的个,十,百等中的一位,范围都是0 - 9;
如 15, 分为 个位的 5 和 十位的 1;
过程: 分配一个大小为10 的数组bucket,首先遍历源数列src中的数值的个位,在bucket中记录下数列src的每一个个位 数值的个数;再合计,最后依次放入临时数组中排序。。。;详细过程代码如下:
#include<iostream>
#include<vector>
using namespace std;
//桶排序 时间复杂度 O(x * n)
/*
*/
#define RADIX 10
void my_swap(int& first, int& second)
{
int tmp = first;
first = second;
second = tmp;
}
void RadixSort(vector<int>& vec)
{
if (vec.empty()) return;
int max = INT_MIN;
int len = vec.size();
int bucket[RADIX];//桶的大小固定为10,初始化为0
int* pTmp = new int[len];//临时数组
for (auto val : vec)
if (val > max) max = val;
//先排序个位,再十位...
for (int level = 1; max / level != 0; level *= 10)
{
memset(bucket, 0, sizeof(int)*RADIX);
memset(pTmp, 0, sizeof(int)*len);
for (int i = 0; i < len; i++)
{
//记录桶中 0 - 9 各个数字的个数
bucket[vec[i] / level % 10]++;
}
//记录桶中各个数字(0-9)前面(包括自身),合计已有多少个
for (int j = 1; j < RADIX; j++)
{
bucket[j] += bucket[j - 1];
}
//(重点)-完成上一步后, bucket中的值为1,2,3.。。这一连续值,代表的是vec数列中的值在
//bucket中的下标
for (int k = len - 1; k >= 0; k--)
{
bucket[vec[k] / level % 10]--;
//bucket[vec[k] / level % 10] -- vec[k]这个值在bucket中排序的位置
pTmp[bucket[vec[k] / level % 10]] = vec[k];
}
//重新赋值到vec
for (int ival = 0; ival < len; ival++) {
vec[ival] = pTmp[ival];
}
}
}
int main()
{
vector<int> arr = { 12,5,9,34,3,97,63,23,53,87,120,999,1024,11,77 };
cout << "raw val is:\n";
for (auto i : arr)
cout << i << "\t";
cout << endl;
RadixSort(arr);
cout << "BucketSorted val is:\n";
for (auto i : arr)
cout << i << "\t";
cout << endl;
system("pause");
return 0;
}