#include <iostream>
using namespace std;
int findMax(int arr[], int len) {
int max = arr[0];
for (int i = 0; i < len; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
return max;
}
int calBitCount(int max) {
int count = 0;
while (max > 0) {
max /= 10;
count++;
}
return count;
}
int getBitValue(int value, int bit) {
for (int i = 0; i < bit; ++i) {
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 i = 0; i < radixCount; i++) {
count[i] = 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 - 1];
}
for (int i = len - 1; i >= 0; --i) {
int bitValue = getBitValue(arr[i], b);
tempArray[--count[bitValue]] = arr[i];
}
for (int j = 0; j < len; j++) {
arr[j] = tempArray[j];
}
}
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[] = {20, 23, 96, 52, 34, 17, 55, 64, 31};
int len = sizeof(arr) / sizeof(int);
printArray(arr, len);
radixSort(arr, len);
printArray(arr, len);
int arr1[] = {231, 150, 234, 987, 211, 985, 996, 300};
int len1 = sizeof(arr1) / sizeof(int);
printArray(arr1, len1);
radixSort(arr1, len1);
printArray(arr1, len1);
}