编辑代码

#include <stdio.h>

// 获取数组中的最大值
int getMax(int arr[], int len) {
    int max = arr[0];
    for (int i = 1; i < len; i++) {
        if (arr[i] > max) {
            max = arr[i];
        }
    }
    return max;
}

// 使用计数排序对数组按照指定的位数进行排序
void countingSort(int arr[], int len, int exp) {
    int radixCount = 10; // 基数为10,因为数字有10个可能的值(0到9)
    int tempArray[len];
    int countArray[radixCount];
    for(int i = 0; i < radixCount; i++){
        countArray[i] = 0;
    }

    // 统计每个桶中的元素个数
    for (int i = 0; i < len; i++) {
        countArray[(arr[i] / exp) % radixCount]++;
    }

    // 将count数组转换为每个桶的实际位置
    for (int i = 1; i < radixCount; i++) {
        countArray[i] += countArray[i - 1];
    }

    // 从右到左遍历原数组,将元素放入对应的桶中
    for (int i = len - 1; i >= 0; i--) {
        tempArray[countArray[(arr[i] / exp) % radixCount] - 1] = arr[i];
        countArray[(arr[i] / exp) % radixCount]--;
    }

    // 将排序好的数组拷贝回原数组
    for (int i = 0; i < len; i++) {
        arr[i] = tempArray[i];
    }
}

// 基数排序函数
void radixSort(int arr[], int len) {
    int max = getMax(arr, len);

    // 从最低位到最高位依次对每一位进行计数排序
    for (int exp = 1; max / exp > 0; exp *= 10) {
        countingSort(arr, len, exp);
    }
}

// 打印数组
void printArray(int arr[], int size) {
    for (int i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

int main() {
    int arr[] = {33, 17, 580, 290, 273, 7, 3, 19};
    int len = sizeof(arr) / sizeof(arr[0]);

    printf("原始数组:\n");
    printArray(arr, len);

    radixSort(arr, len);

    printf("排序后的数组:\n");
    printArray(arr, len);

    return 0;
}