计数排序

title

计数排序(Counting Sort)是一种非比较排序算法,可以在线性时间复杂度(O(n))内对一定范围内的整数数据进行排序。计数排序不是基于比较的排序算法,而是通过统计元素出现次数来实现排序。它的基本思想是对于给定的输入序列中的每个元素x,确定该序列中值小于x的元素的个数,利用这个信息将x直接放到它最终的输出位置上。计数排序需要一个额外的数组C,其中第i个元素是待排序数组A中值等于i的元素的个数。然后根据数组C来将A中的元素排到正确的位置。

以下是计数排序的C语言实现:


#include <stdio.h>

void countingSort(int arr[], int n, int max) {
    int count[max + 1]; // 用于统计待排序序列中每个元素的个数
    int output[n]; // 存储排序后的结果
    int i;

    // 将 count 数组中的所有元素初始化为0
    for (i = 0; i <= max; ++i) {
        count[i] = 0;
    }

    // 统计待排序序列中每个元素的个数
    for (i = 0; i < n; ++i) {
        ++count[arr[i]];
    }

    // 对 count 数组中的元素进行累加
    for (i = 1; i <= max; ++i) {
        count[i] += count[i - 1];
    }

    // 将待排序序列中的元素放到 output 数组中
    for (i = n - 1; i >= 0; --i) {
        output[count[arr[i]] - 1] = arr[i];
        --count[arr[i]];
    }

    // 将排序后的结果赋值给原始数组
    for (i = 0; i < n; ++i) {
        arr[i] = output[i];
    }
}

int main() {
    int arr[] = {6, 3, 9, 2, 7, 8, 4, 5, 1, 0};
    int n = sizeof(arr) / sizeof(arr[0]);
    int max = arr[0];
    int i;

    // 找出待排序序列中的最大值
    for (i = 1; i < n; ++i) {
        if (arr[i] > max) {
            max = arr[i];
        }
    }

    countingSort(arr, n, max);

    // 输出排序后的结果
    for (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 ""