#include <iostream>
using namespace std;
int findMax(int arr[], int len) {
int max = arr[0];
for(int i = 1; i < len; ++i) {
if (arr[i] > max) {
max = arr[i];
}
}
return max;
}
int calBitCount(int max) {
int bitCount = 0;
while(1) {
if(max == 0) {
break;
}
max = max/10;
bitCount++;
}
return bitCount;
}
int getBitValue(int value, int bit) {
for(int i = 0; i < bit; ++i) {
value = value/10;
}
return value%10;
}
void radixSort(int arr[], int len) {
int max = findMax(arr, len);
int bitCount = calBitCount(max);
int radixCount = 10;
int* count = new int[radixCount]();
int* tempArray = new int[len]();
for(int b = 0; b < bitCount; ++b) {
for (int c = 0; c < radixCount; ++c) {
count[c] = 0;
}
for(int i = 0; i < len; ++i) {
int bitValue = getBitValue(arr[i], b);
++count[bitValue];
}
for(int c = 1; c < radixCount; ++c) {
count[c] = count[c] + count[c-1];
}
for(int i = len - 1; i >= 0; --i) {
int valueIndex = getBitValue(arr[i], b);
--count[valueIndex];
tempArray[count[valueIndex]] = arr[i];
}
for(int i = 0; i < len; ++i) {
arr[i] = tempArray[i];
}
}
delete tempArray;
delete count;
}
void printArray(int arr[], int len) {
for(int i = 0; i < len; ++i) {
cout << arr[i] << " ";
}
cout << endl;
}
int main(){
int arr[] = {3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};
int len = sizeof(arr)/sizeof(int);
cout << "排序前:";
printArray(arr, len);
radixSort(arr, len);
cout << "排序后:";
printArray(arr,len);
int arr2[] = {126,69,593,23,6,89,54,8};
int len2 = sizeof(arr2)/sizeof(int);
cout << "排序前:";
printArray(arr2, len2);
radixSort(arr2, len2);
cout << "排序后:";
printArray(arr2,len2);
}