📜  计数排序的C程序(1)

📅  最后修改于: 2023-12-03 15:41:36.510000             🧑  作者: Mango

计数排序的C程序介绍

计数排序是一种非比较排序算法,其核心思想是统计每个元素的出现次数,然后根据元素的大小关系将它们放到有序的位置上。由于计数排序的时间复杂度为O(n),并且只要待排序的元素个数在一定范围内,就可以使用计数排序进行排序。

程序实现

首先,定义一个计数排序函数countingSort,用于排序输入的数组。计数排序主要分为三个步骤:计数、累加、排序。具体实现如下:

void countingSort(int arr[], int n) {
    int max = arr[0]; // 找到最大值
    for (int i = 1; i < n; i++) {
        if (arr[i] > max)
            max = arr[i];
    }
    int count[max + 1]; // 定义计数数组
    for (int i = 0; i <= max; ++i) {
        count[i] = 0;
    }
    for (int i = 0; i < n; i++) { // 计数
        ++count[arr[i]];
    }

    for (int i = 1; i <= max; i++) { // 累加
        count[i] += count[i - 1];
    }

    int output[n]; // 定义输出数组
    for (int i = n - 1; i >= 0; i--) { // 排序
        output[count[arr[i]] - 1] = arr[i];
        --count[arr[i]];
    }

    for (int i = 0; i < n; i++) { // 将输出数组赋值给输入数组
        arr[i] = output[i];
    }
}
程序演示

下面是一个简单的程序演示,演示如何使用计数排序对一个包含10个数的数组进行排序。

#include <stdio.h>

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

    countingSort(arr, n);

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

    return 0;
}

输出结果为:

排序后的数组为:1 1 2 2 3 4 4 5 6 7 
总结

计数排序是一种简单而高效的排序算法,适用于待排序的元素个数在一定范围内的情况。在实际应用中,需要注意选择合适的计数数组的大小,避免空间浪费和溢出问题。