📜  计数排序 - C 编程语言(1)

📅  最后修改于: 2023-12-03 14:57:26.157000             🧑  作者: Mango

计数排序 - C 编程语言

计数排序是一种常见的线性时间复杂度的排序算法,适用于整数排序问题。它通过统计每个元素出现的次数,并通过累加计算元素的正确位置,最终得到排序后的结果。

算法步骤

计数排序的算法步骤如下:

  1. 统计待排序数组中每个元素出现的次数,得到一个计数数组。
  2. 对计数数组进行累加操作,得到每个元素的正确位置信息。
  3. 创建一个与待排序数组大小相同的临时数组。
  4. 遍历待排序数组,根据计数数组中的正确位置信息将元素放入临时数组中。
  5. 将临时数组中的元素复制回待排序数组,完成排序。
C 代码实现

以下是使用 C 编程语言实现计数排序算法的代码示例:

#include<stdio.h>
#include<stdlib.h>

// 最大元素值
#define MAX_VALUE 100

void countingSort(int array[], int size) {
    int count[MAX_VALUE+1] = {0}; // 计数数组

    // 统计每个元素出现的次数
    for (int i = 0; i < size; ++i) {
        ++count[array[i]];
    }

    // 对计数数组进行累加
    for (int i = 1; i <= MAX_VALUE; ++i) {
        count[i] += count[i-1];
    }

    int temp[size]; // 临时数组

    // 根据计数数组的正确位置信息进行排序
    for (int i = size-1; i >= 0; --i) {
        temp[count[array[i]]-1] = array[i];
        --count[array[i]];
    }

    // 将临时数组中的元素复制回原数组
    for (int i = 0; i < size; ++i) {
        array[i] = temp[i];
    }
}

int main() {
    int array[] = {7, 5, 2, 9, 1, 4, 8, 6, 3};
    int size = sizeof(array) / sizeof(array[0]);

    countingSort(array, size);

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

    return 0;
}
示例结果
排序后的数组:1 2 3 4 5 6 7 8 9

通过计数排序算法,我们把输入数组 {7, 5, 2, 9, 1, 4, 8, 6, 3} 进行排序,得到了一个升序数组 {1, 2, 3, 4, 5, 6, 7, 8, 9}。计数排序算法的时间复杂度为 O(n+k),其中 n 是数组的大小,k 是最大元素值。