上一篇
在众多排序算法中,C语言计数排序是一种非常高效的线性时间排序方法。它不依赖元素间的比较,而是通过统计每个元素出现的次数来实现排序。本教程将从原理、步骤到完整代码,手把手带你掌握这一经典算法,即使是编程小白也能轻松理解!
计数排序算法适用于待排序元素为整数且取值范围不大的情况。它的核心思想是:先统计每个数值出现的次数,然后根据这些统计信息直接将元素放置到正确的位置上。
与快速排序、冒泡排序等基于比较的算法不同,计数排序的时间复杂度为 O(n + k),其中 n 是元素个数,k 是数据范围(最大值 - 最小值 + 1)。当 k 不是特别大时,计数排序效率极高。

下面是一个完整的 C语言计数排序实现示例:
#include <stdio.h>#include <stdlib.h>// 计数排序函数void countingSort(int arr[], int n) { // 步骤1:找到最大值和最小值 int max = arr[0], min = arr[0]; for (int i = 1; i < n; i++) { if (arr[i] > max) max = arr[i]; if (arr[i] < min) min = arr[i]; } int range = max - min + 1; int *count = (int *)calloc(range, sizeof(int)); int *output = (int *)malloc(n * sizeof(int)); // 步骤2:统计每个元素出现的次数 for (int i = 0; i < n; i++) { count[arr[i] - min]++; } // 步骤3:将计数数组转换为位置索引(可选,用于稳定排序) for (int i = 1; i < range; i++) { count[i] += count[i - 1]; } // 步骤4:从后往前填充输出数组(保证稳定性) for (int i = n - 1; i >= 0; i--) { output[count[arr[i] - min] - 1] = arr[i]; count[arr[i] - min]--; } // 步骤5:将排序结果复制回原数组 for (int i = 0; i < n; i++) { arr[i] = output[i]; } free(count); free(output);}// 测试函数int main() { int arr[] = {4, 2, 2, 8, 3, 3, 1}; int n = sizeof(arr) / sizeof(arr[0]); printf("排序前: "); for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } countingSort(arr, n); printf("\n排序后: "); for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } printf("\n"); return 0;}优点:
缺点:
如果你正在学习 C语言排序教程,计数排序非常适合以下场景:
通过本教程,你已经掌握了 C语言计数排序 的基本原理与实现方法。作为一种高效的 线性时间排序 算法,它在特定场景下表现优异。建议你动手运行上述代码,修改测试数据,加深理解。继续学习更多 C语言排序教程,你将逐步构建扎实的算法基础!
本文由主机测评网于2025-12-21发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://vpshk.cn/20251210731.html