基数排序
概念见基数排序。
C++实现
#include <iostream>
#include <vector>
using namespace std;
/**
* 获取一个数组的最大值对应的十进制位数
*/
int getMaxBit(std::vector<int> nums) {
int max_num = nums[0], bit = 0;
for(int num : nums)
max_num = max_num > num ? max_num:num;
while(max_num > 0) {
max_num /= 10;
bit++;
}
return bit;
}
/*
* 基数排序
*/
void radixSort(std::vector<int> &nums, bool reverse=false) {
int bit = getMaxBit(nums);
int n = nums.size();
int radix = 1;
int cnt[10] = {0};
int *temp = new int[n];
int *bins = new int[n];
while(bit--) {
// 清空
for(int i = 0; i < 10; ++i)
cnt[i] = 0;
// 从个位到高位,计算数组每个元素当前位数
for(int i = 0; i < n; ++i) {
temp[i] = (nums[i] / radix) % 10;
cnt[temp[i]]++;
}
for(int i = 1; i < 10; ++i) // 计算各个桶的在bins的边界
cnt[i] += cnt[i-1];
// 根据当前位数,将所有元素分配到相应桶中
for(int i = n-1; i >= 0; --i)
bins[--cnt[temp[i]] ] = nums[i];
// 从桶中取出排列
if(reverse && bit == 0) { // 降序排序
for(int i = 0; i < n; ++i)
nums[i] = bins[n-1-i];
}
else { // 升序排序(默认)
for(int i = 0; i < n; ++i)
nums[i] = bins[i];
}
radix *= 10;
}
}
int main() {
std::vector<int> v;
v = {125, 4000, 123, 342, 331, 209, 2};
radixSort(v);
for(int n : v)
cout << n << " ";
return 0;
}