基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog(r)m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法。 此算法结合计数排序以空间换时间的思路进行基数数排序,元素必须为整数(正数、负数、0) #include <stdlib.h>
#include <stdio.h>
#include <list>
#include <vector>
void print(std::vector<int> arr) {
for (int i = 0; i < arr.size(); i++) {
printf("%6d", arr[i]);
}
printf("\n");
}
void radixSort(std::vector<int> arr,int base) {
int n = arr.size(); //获取元素个数
int radixSize = 19; //桶个数
int offset = 9; //标记相对于数组0的偏移位数
bool tag = false; //标记是否需要递归
std::vector<int> result(n, 0); //存储最终计算结果
std::vector<int> tmpRecord(n, 0); //存储索引,次索引可以不存储,但是取数据的时候需要重新映射计算
result.resize(n, 0);
tmpRecord.resize(n, 0);
int mapArr[19] = {0}; //区间集合声明用[0,18] 表示 [-9.9]
for (int i = 0; i < n; i++) {
int tmp = arr[i] /base;
if (tmp > 0) {
tag = true;
}
int r = tmp % 10;
mapArr[r+offset]++;
tmpRecord[i] = r+offset;
}
if (!tag) { //验证排序是否完毕
print(arr); //打印测试
return;
}
//分布计算
for (int i = 1; i < radixSize; i++) {
mapArr[i] += mapArr[i - 1];
}
//还原
for (int i = n-1; i>=0; i--) {
result[mapArr[tmpRecord[i]]-1] = arr[i];
mapArr[tmpRecord[i]]--;
}
if (tag) {//排序未完毕,继续排序
base *= 10;
radixSort(result,base);
}
}
void radixSort(std::vector<int> arr) {
radixSort(arr, 1);
}
int main(){
std::vector<int> a = { 2,5,3,0,2,3,0,-1};
//bsort(a, 8,-1,6);
radixSort(a);
return 0;
}