#include <vector>
#include <set>
#include <algorithm>
void ArrPrint(std::vector<int> const & arr){
for (auto i : arr){
printf("%d ", i);
}
printf("\n");
}
//iBase 桶数
void radixsort(std::vector<int> & arr,unsigned int iBase){
if (0 == iBase)
iBase = 10;
int iExp = 1; //将数据分配到桶内的依据位 1 1*iBase 1*iBase*iBase ...
int iMax = *std::max_element(arr.begin(), arr.end());
while (iMax / iExp > 0){
std::vector<int> bucket,temp;
bucket.resize(iBase); //桶
temp.resize(arr.size()); //临时数组,用于收集桶内数据
for (auto i : arr){
bucket[i / iExp%iBase]++; //计算每个桶内数据个数
}
for (int i = 1; i < bucket.size(); i++)
bucket[i] += bucket[i - 1]; // 为了收集桶数据,计算每个桶以及前面所有桶的数据个数总数
// 也就知道 arr[i] 在收集桶内数据时,排第几
for (int i = arr.size() - 1; i >= 0; i--){
int iCount = bucket[arr[i] / iExp %iBase]; // 将数据划分到桶内后,
//桶 arr[i] / iExp %iBase 自己以及前面一共有多少个数据
temp[--iCount] = arr[i]; //如果某个桶本身已经前面的桶一共有
//iCount个数字,则从第一个桶开始收集,
//这个桶的做后一个数字在收集后数组的下标是 iCount-1
bucket[arr[i] / iExp %iBase] = iCount; // 桶内数据减一,基于这个原因,
//本循环要从n-1到0迭代,否则收集桶数据的temp下标计算错误
}
std::copy(temp.begin(), temp.end(), arr.begin()); //将收集的数据从新放入数组,用于下次分配
printf("\nPASS : ");
ArrPrint(arr);
iExp *= iBase;
}
}
int main()
{
std::vector<int> arr = { 521, 310, 72, 373, 15, 546, 385, 856, 187, 147 };
printf("\nARRAY : ");
ArrPrint(arr);
radixsort(arr,10); //分成10个桶进行排序
printf("\nSORTED : ");
ArrPrint(arr);
return 0;
}
可以使用不同的 iBase(桶个数)验证, (2、4 验证正确。)
算法分析(桶分配过程与桶数据收集) :http://blog.csdn.net/cjf_iceking/article/details/7943609
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ezhong的博客签名-------------------------------------
以上内容来自ezhong的博客园,作者:ezhong
ezhong的博客园: http://www.cnblogs.com/ezhong
感谢您的阅读。感谢您的分享。
浙公网安备 33010602011771号