基数排序

title

基数排序(Radix Sort)是一种非比较性的排序算法,它根据元素的每个位上的数字来排序。基数排序常用于整数排序,可以将整数按照各个位数上的数字进行排序,时间复杂度为O(dn),其中d为位数,n为元素数量。

下面是一个基数排序的C语言实现示例:


#include <stdio.h>

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

// 基数排序函数
void radixSort(int arr[], int n) {
    int bucket[10][n]; // 用于存放每个位数上的元素
    int bucketCount[10]; // 用于存放每个位数上的元素数量
    int max = getMax(arr, n);
    int digitCount = 0;

    // 计算最大数的位数
    while (max > 0) {
        digitCount++;
        max /= 10;
    }

    int mod = 10;
    int div = 1;

    // 从个位开始进行排序
    for (int i = 0; i < digitCount; i++, mod *= 10, div *= 10) {
        // 清空桶和桶计数器
        for (int j = 0; j < 10; j++) {
            bucketCount[j] = 0;
        }

        // 将元素放入对应的桶中
        for (int j = 0; j < n; j++) {
            int digit = (arr[j] % mod) / div;
            bucket[digit][bucketCount[digit]] = arr[j];
            bucketCount[digit]++;
        }

        // 将桶中的元素依次放回原数组中
        int k = 0;
        for (int j = 0; j < 10; j++) {
            for (int l = 0; l < bucketCount[j]; l++) {
                arr[k] = bucket[j][l];
                k++;
            }
        }
    }
}

// 测试基数排序
int main() {
    int arr[] = {54, 26, 93, 17, 77, 31, 44, 55, 20};
    int n = sizeof(arr) / sizeof(arr[0]);

    printf("原数组:");
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");

    radixSort(arr, n);

    printf("排序后的数组:");
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");

    return 0;
}
powered by Gitbook© 2023 编外计划 | 最后修改: 2023-11-24 03:37:00

results matching ""

    No results matching ""