一、完整代码
随机数函数
int randint(int a, int b)
{
return rand() % (b - a + 1) + a;
}
找最大位数函数
int maxbits(vector<int> &arr)
{
int maxN = arr[0];
for (auto i : arr)
{
maxN = max(i, maxN);
} // 找最大值
int res = 0;
while (maxN)
{
res++;
maxN /= 10;
} // 求最大值有几个十进制位
return res;
} // 找出数组最大的一个数有几位
找对应数位函数
int getDiget(int n, int d)
{
n = n / pow(10, d - 1);
return n % 10;
} // 取出一个数的某一位
基数(桶)排序函数
void radixSort(vector<int> &arr, int L, int R)
{
int digets = maxbits(arr); // digit表示最大值有几个十进制位
const int radix = 10; // 排序十进制,确定基底为10
vector<int> bucket; // 准备等大的额外空间
bucket.resize(arr.size());
for (int d = 1; d <= digets; d++) // 有几个数进出桶几次
{
vector<int> counts;
counts.resize(radix); // 词频统计器统计每一位出现的次数
for (auto i : arr) // 遍历每一个数找到它的目标位,用counts统计
{
counts[getDiget(i, d)]++;
}
for (int i = 1; i < counts.size(); i++)
{
counts[i] += counts[i - 1];
}
for (int i = arr.size() - 1; i > -1; i--) // 从后往前遍历数组放入桶中
{ // 从后往前遍历把该数放到该去的临时位置上
// arr[i]是arr中的这个数
// getDiget取出了目标位
// counts[]找到了对应位存在几个数
// bucket取最后一位数
bucket[counts[getDiget(arr[i], d)] - 1] = arr[i];
counts[getDiget(arr[i], d)]--; // 最后对应位置的计数器自减少
} // 全部放回临时数组了之后别忘记将计数器恢复
arr = bucket; // 桶中元素倒入原来数组
}
} // 基数排序[L, R]区间数组元素
初始化数组函数
vector<int> randomCreateArray(int size, int a, int b)
{
cout << "creating array: ";
vector<int> arr;
for (int i = 0; i < size; i++)
{
arr.push_back(randint(a, b));
cout << arr[i] << ' ';
}
cout << endl;
return arr;
}
主函数
int main()
{
srand(time(0));
vector<int> arr = randomCreateArray(10, 1, 100);
radixSort(arr, 0, arr.size() - 1);
cout << "The sorted array:";
for (auto i : arr)
cout << i << ' ';
cout << endl;
//最后打印有序数组即可
system("pause");
}