基数排序原理:将根据整数的最右边数字将其扔进相应的0~9号的篮子里,对于相同的数字要保持其原来的相对顺序(确保排序算法的稳定性),然后将篮子里的数串起来,然后再进行第二趟的收集(按照第二位的数字进行收集),就这样不断的反复,当没有更多的位时,串起来的数字就是排好序的数字。
排序时按照最低有效位进行排序来解决排序问题。
C++示例:
#include <iostream>
using namespace std;
/*
基数排序
*/
void radixSort(int arr[], int count) {
int bucket[count]; // 记录每个有效位的值的个数
int maxValue = 0; // 数组中最大的值
for (int i = 0; i < count; i++) {
if (arr[i] > maxValue) {
maxValue = arr[i];
}
}
int round = 1;
int digitPosition = 1; // 当前有效位
while (maxValue / digitPosition > 0) {
int digitBucket[10] = {0};
// 统计该有效位0-9数字分别有多少个
for (int i = 0; i < count; i++) {
int digitNum = arr[i] / digitPosition % 10;
digitBucket[digitNum] ++;
}
// 比i小的总数
for (int i = 1; i < 10; i++) {
digitBucket[i] += digitBucket[i - 1];
}
// 当前有效位小的数据的数放入前面
for (int i = count - 1; i >= 0; i--) {
int digitNum = arr[i] / digitPosition % 10;
digitBucket[digitNum]--;
bucket[digitBucket[digitNum]] = arr[i];
}
for (int i = 0; i < count; i++) {
arr[i] = bucket[i];
}
cout << "round#" << round << ":";
round ++;
printArray(arr, count);
digitPosition *= 10;
}
}
/*
主函数(入口函数)
*/
int main(int argc, const char * argv[]) {
int arrA[10] = {12,321,42,53,562,11,4,45,63,543};
radixSort(arrA, 10);
return 0;
}
输出结果:
基数排序的时间复杂度是:(n+d)d为最大数的有效位数。