#include <iostream>
#include <cmath>
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) {
if (max == 0) return 1;
return static_cast<int>(log10(max)) + 1;
}
int getBitValue(int value, int bit) {
int bitValue = (value / static_cast<int>(pow(10, bit))) % 10;
return bitValue;
}
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++)
count[getBitValue(arr[i], b)]++;
for (int i = 1; i < radixCount; i++)
count[i] += count[i - 1];
for (int i = len - 1; i >= 0; i--) {
int value = arr[i];
int valueBit = getBitValue(value, b);
tempArray[count[valueBit] - 1] = value;
count[valueBit]--;
}
for (int i = 0; i < len; i++) {
arr[i] = tempArray[i];
}
}
delete[] count;
delete[] tempArray;
}
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(arr[0]);
cout << "排序前:" << endl;
printArray(arr, len);
radixSort(arr, len);
cout << "排序后:" << endl;
printArray(arr, len);
return 0;
}