文章目录
- 算法思想
- 操作步骤
- 计数排序的特性总结
- 代码实现
算法思想
计数排序是一种非比较排序,又称为鸽巢原理,是对哈希直接定址法的变形应用。
操作步骤
- 统计相同元素出现次数;
- 根据统计的结果将序列回收到原来的序列中。
计数排序的特性总结
- 计数排序在数据范围集中时,效率很高,但是适用范围及场景有限。
- 时间复杂度:O(MAX(N,range))
- 空间复杂度:O(range)
- 稳定性:稳定
代码实现
#include<stdio.h>
#include<stdlib.h>
//时间复杂度 O(N+range)
//空间复杂度 O(range)
//适合范围集中的数据,只适合整型
void countSort(int* a, int n)//计数排序 -- 非比较排序
{
int maxArr = a[0], minArr = a[0];//1.求最大值和最小值
for (int i = 0; i < n; i++)
{
if (maxArr < a[i])maxArr = a[i];
if (minArr > a[i])minArr = a[i];
}
int range = maxArr - minArr + 1;//2.相对映射,开range个空间
int* countA = (int*)calloc(range, sizeof(int));
if (countA == NULL)
{
perror("calloc fail\n");
exit(-1);
}
for (int i = 0; i < n; i++)
{
countA[a[i] - minArr]++;//3.计数
}
int k = 0;
for (int j = 0; j < range; j++)
{
while (countA[j]--)//4.排序
{
a[k++] = j + minArr;
}
}
for (int i = 0; i < n; i++)
{
printf("%d ", a[i]);
}
free(countA);
}
int main()
{
int arr[] = { 9,6,7,-1,-3,9,4,4,-1,1,-3 };
countSort(arr, sizeof(arr) / sizeof(int));
return 0;
}