1.概念
计数排序是一种非比较排序,它适用于范围比较集中的数据处理。临时开辟一个数组,通过统计数据的个数,将数据集中,再将这个数组展开,实现排序的过程。
2.代码展示
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
void CountSort(int *arr,int n)
{
int max , min = arr[0];
max = min;
for (int i = 0; i < n; i++)
{
if (arr[i] > max)
{
max = arr[i];
}
if (arr[i]<=min)
{
min = arr[i];
}
}
int range = max - min+1;
int* a = (int*)malloc(sizeof(int)*range);
for (int i = 0; i < range; i++)
{
a[i] = 0;
}
int count = 0;
for (int i = 0; i < n; i++)
{
a[arr[i] - min ]++;
}
for (int i = 0; i < range; i++)
{
while (a[i] > 0)
{
arr[count] = i + min;
count++;
a[i]--;
}
}
free(a);
}
void Print(int *arr, int n)
{
for (int i = 0; i < n; i++)
{
printf("%d ",arr[i]);
}
printf("\n");
}
int main()
{
int arr[] = { 9,8,8,8,8,4,4,10,10,5,6,8};
int n = sizeof(arr) / sizeof(arr[0]);
CountSort(arr,n);
Print(arr, n);
system("pause");
return 0;
}
3.结果展示
4.复杂度分析
时间复杂度 O(max(N,范围))
空间复杂度 O(范围)
5.心得体会
首先就是C语言对范围检查不是很严格,我开辟数组的时候,仅仅开辟了Max-min个大小,最后也没有释放空间,但是程序可以正常运行。我通过查看内存,发现初始化的时候已经越界访问了,这样是非常不安全的,最后我加了free函数,程序才出现报错,所以对空间的检查放到了释放。我们写代码一定要注意细节。
另外我在大小比较的时候偷懒,直接用了else,导致程序出现了问题,我仔细检查后发现问题,以后真是不能偷懒,要想清楚再写出简单一点的写法,一定要细心!!!