点击查看代码
#include<cstdio>
#pragma warning(disable:4996)
//桶排序:对元素按照flag(个、十、百位)进行排序
void BucketSort(int a[], int n, int flag) {
int* tmp = new int[n]; //临时数组tmp[]暂存排序数据
//buckets[]是桶,其大小为数据的基数范围(本次测试为十进制,需要10个桶),bucket[i]存储尾数为i的元素个数
int i, buckets[10] = { 0 };
/*
1、分桶
按照flag排序,将相同尾数的元素放进相同的桶中,如尾数k=a[i]/flag%10,则a[i]放入k桶中
*/
for (i = 0; i < n; i++) {
buckets[a[i] / flag % 10]++;
}
/*
2、改桶
让更改后的buckets[]值表示元素按尾数大小顺序摆放在tmp[]中的位置
尾数0固定放在开头,从尾数1开始修改
*/
for (i = 1; i < 10; i++) {
buckets[i] = buckets[i - 1] + buckets[i];
}
/*
3、从桶中取数排序
桶排序是后进后出,所以a[i]从最后取数,从后往前排序
*/
for (i = n - 1; i >= 0; i--) {
tmp[buckets[a[i] / flag % 10] - 1] = a[i]; //数组从下标0开始,buckets[]减一才是元素在tmp[]中的真正位置
buckets[a[i] / flag % 10]--; //每排好一个元素,桶中的尾数记录要减一
}
//4、把排序好的元素放回a[]中
for (i = 0; i < n; i++) {
a[i] = tmp[i];
}
delete[] tmp;//释放tmp[]的内存
}
/*
函数功能:基数排序(升序排序)
函数列表:
a[]:待排序序列
n:待排序元素个数
*/
void RadixSort(int a[], int n) {
int flag; //排序模式:按个位排序时flag=1,按十位排序flag=10,按百位排序flag=100...
int max = a[0]; //记录a[]中最大值,用于下面求最大flag位
for (int i = 1; i < n; i++) { //查找a[]的最大值
if (a[i] > max) {
max = a[i];
}
}
//每轮flag扩大10倍依次从个、十、百位对a[]进行桶排序,max/flag>0表示该flag位有效
for (flag = 1; max / flag > 0; flag *= 10) {
BucketSort(a, n, flag);
}
}