一、原理
对待排序数组遍历两次:
第一次,遍历选出max与min,从而算出范围range=max-min,创造一个元素个数为range的数组并将其所有元素初始化成0
第二次,遍历统计各元素出现的次数,记录在tmp数组中
根据tmp数组填充arr,使之有序
画图分析:
代码展示:
void CountSort(int* arr, int sz)
{
int max = arr[0];
int min = arr[0];
//第一次遍历选出max与min
for (int i = 0; i < sz; i++)
{
if (arr[i] > max)
{
max = arr[i];
}
if (arr[i] < min)
{
min = arr[i];
}
}
//根据max与min确定范围range作为tmp的大小
int range = max - min + 1;
//创建tmp数组
int* tmp = (int*)malloc(sizeof(int) * range);
if (tmp == NULL)
{
perror("malloc failure");
return -1;
}
//将tmp数组所有元素初始化为0
memset(tmp, 0, sizeof(int) * range);
//第二次遍历在tmp中填充arr中各元素出现次数
for (int i = 0; i < sz; i++)
{
tmp[arr[i] - min]++;//注意理解这句代码
}
int j = 0;//j变量用于调控arr数组的下标
//在arr中填充元素
for (int i = 0; i < range; i++)
{
while (tmp[i])
{
arr[j++] = i + min;
tmp[i]--;
}
}
}
int main()
{
int arr[] = { 5,2,3,8,7,6,6,5,5,4,1,1,4,7,8,9,0,0 };
int sz = sizeof(arr) / sizeof(arr[0]);
CountSort(arr, sz);
for (int i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
二、特性总结
1.适用于范围集中,极差不大的整形数组的排序
2.时间复杂度:O(N)
3.空间复杂度:O(N)
四、小结
本人是C语言萌新一枚,希望能和大家多多交流,共同进步。如果对文章内容有什么指正、建议、疑问。欢迎在下方评论区留言一起探讨,谢谢大家!