计数排序(Counting Sort)是一种非比较性质的排序算法,其时间复杂度为O(n+k)(其中n为待排序的元素个数,k为不同值的个数)。这意味着在数据值范围不大并且离散分布的情况下,规模越大,排序速度越快的特点。然而,如果数列元素不满足整数和有确定范围的条件,则不能使用计数排序。
- #include
- #include
- #include
-
- // 计数排序
- void count_sort(int num[], int len) {
- // 寻找最大值
- int max = num[0];
- for (int i = 1; i < len; i++) {
- max = max > num[i] ? max : num[i]; // 更新最大值
- }
-
- int range = max + 1; // 计数数组的长度为最大值加1
- int *arr = (int *)malloc(sizeof(int) * range); // 申请空间
-
- memset(arr, 0, sizeof(int) * range); // 初始化计数数组为0
-
- for (int i = 0; i < len; i++) {
- arr[num[i]]++; // 对每个元素进行计数
- }
-
- // 填充原数组
- int j = 0;
- for (int i = 0; i < range; i++) {
- while (arr[i] != 0) { // 将计数数组中的每个非零元素放回原数组
- num[j] = i; // 填充元素
- arr[i]--; // 计数减一
- j++; // 标记原数组填充到的位置
- }
- }
-
- free(arr); // 释放计数数组空间
- }
-
-
- int main() {
- int num[12] = { 5, 8, 5, 4, 6, 8, 9, 7, 2, 3, 4, 5 };
- count_sort(num, 12); // 执行计数排序
- // 打印结果
- for (int i = 0; i < 12; i++)
- {
- printf("%d ", num[i]);
- }
- return 0;
- }
输出结果:
2 3 4 4 5 5 5 6 7 8 8 9
- #include
- #include
- #include
-
- // 计数排序函数
- void count_sort(int num[], int len) {
- int max = num[0]; // 初始化最大值为数组第一个元素
- int min = num[0]; // 初始化最小值为数组第一个元素
-
- // 找出数组中最大值和最小值
- for (int i = 1; i < len; i++) {
- max = max > num[i] ? max : num[i];
- min = min < num[i] ? min : num[i];
- }
-
- int range = max - min + 1; // 计算最大值与最小值的差值和1(确定结果数组的大小)
-
- // 动态分配range大小的计数数组,并初始化为0
- int *arr = (int *)malloc(sizeof(int) * range);
- memset(arr, 0, sizeof(int) * range);
-
- // 计算每个元素出现的次数
- for (int i = 0; i < len; i++) {
- arr[num[i]-min]++; // 使用当前元素值减去最小值作为索引
- }
-
- // 按升序排列原数组
- for (int i = 0, t = 0; i < range; i++) {
- while (arr[i] != 0) {
- num[t] = i + min; // 使用当前索引加上最小值得到原始值
- t++;
- arr[i]--; // 减去一个元素的计数
- }
- }
-
- // 释放动态分配的计数数组空间
- free(arr);
- }
-
- int main() {
- // 待排序的数组
- int num[10] = { -10, 10, -9, 9, 8, 7, 7, 6, 6, 6 };
-
- // 使用计数排序算法进行排序
- count_sort(num, 10);
-
- // 输出排序后的数组元素
- for (int i = 0; i < 10; i++) {
- printf("%d ", num[i]);
- }
-
- return 0;
- }
1.可以实现包含负数的数组排序