✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。
🍎个人主页: 小嗷犬的博客
🍊个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。
🥭本文内容:C/C++ 计数排序
1.什么是计数排序
计数排序(Counting Sort)是一种非基于比较的排序算法,该算法于1954年由 Harold H. Seward 提出。
计数排序的步骤如下:
- 找出待排序的数组中最大和最小的元素
- 统计数组中每个值为
i
的元素出现的次数,存入数组C
的第i
项- 对所有的计数累加(从
C
中的第一个元素开始,每一项和前一项相加)- 反向填充目标数组:将每个元素
i
放在新数组的第C[i]
项,每放一个元素就将C[i]
减去1
它的优势在于在对一定范围内的整数排序时,它的复杂度为
Ο(n + k)
(其中k
是整数的范围),快于任何比较排序算法。当然这是一种牺牲空间换取时间的做法,而且当
O(k)
>O(n * log(n))
的时候其效率反而不如基于比较的排序(基于比较的排序的时间复杂度在理论上的下限是O(n * log(n))
, 如归并排序,堆排序)(来自百度百科:https://baike.baidu.com/item/%E8%AE%A1%E6%95%B0%E6%8E%92%E5%BA%8F/8518144)
2.动图演示
(来自菜鸟教程: https://www.runoob.com/w3cnote/counting-sort.html)
3.C/C++代码实现
#include <stdlib.h>
void countingSort(int *ini_arr, int *sorted_arr, int n, int maxValue)
{
int *count_arr = (int *)malloc(sizeof(int) * maxValue);
int i, j, k;
for (k = 0; k <= maxValue; k++)
count_arr[k] = 0;
for (i = 0; i < n; i++)
count_arr[ini_arr[i]]++;
for (k = 1; k <= maxValue; k++)
count_arr[k] += count_arr[k - 1];
for (j = n; j > 0; j--)
sorted_arr[--count_arr[ini_arr[j - 1]]] = ini_arr[j - 1];
free(count_arr);
}
时间复杂度:O(n + k)
空间复杂度:O(k)