#include <stdio.h>
#include <stdlib.h>
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 calcBitCount(int arr[], int len) {
int max = findMax(arr, len);
int bitCount = 1;
while((max = max/10) > 0) {
++bitCount;
}
return bitCount;
}
void clearArray(int arr[], int len) {
for (int i = 0; i < len; i++) {
arr[i] = 0;
}
}
int getCurrentBitValue(int value, int bit) {
for(int i = 0; i < bit; ++i) {
value = value / 10;
}
return value % 10;
}
void radixSort(int arr[], int len) {
int bitCount = calcBitCount(arr, len);
int radixCount = 10;
int *countArray = (int*)malloc(sizeof(int)*(radixCount));
int *tempArray = (int*)malloc(sizeof(int)*(len));
for (int i = 0; i < bitCount; i++) {
clearArray(countArray, radixCount);
for (int j = 0; j < len; j++) {
int bitValue = getCurrentBitValue(arr[j], i);
++countArray[bitValue];
}
for (int c = 0; c < radixCount; c++) {
countArray[c] = countArray[c] + countArray[c - 1];
}
for (int j = len - 1; j >= 0; j--) {
int bitValue = getCurrentBitValue(arr[j], i);
tempArray[--countArray[bitValue]] = arr[j];
}
for (int j = 0 ; j < len; j++) {
arr[j] = tempArray[j];
}
}
free(countArray);
free(tempArray);
}
void printArray(int arr[], int len) {
for(int i = 0; i < len; i++) {
printf("%4d",arr[i]);
}
printf("\n");
}
int main () {
int arr1[] = {70, 45, 75, 90, 82, 24, 2, 66};
int length1 = sizeof(arr1) / sizeof(arr1[0]);
printArray(arr1,length1);
radixSort(arr1, length1);
printf("排序后的数组:\n");
printArray(arr1,length1);
return 0;
}