一.基础(绝对位置排序)
计数排序只比较不排序。
从0到9遍历,遇到几就打印几次。
二.优化(相对位置排序)
可以看出上面方法有较大的缺陷,如果有个数据是100000,那么我们就需要开100000大的数组,很明显会降低效率。
上面一组数据,我们可以先用最大值减最小值求出范围(9),再用每个数减去最小值再进行映射(0~9)。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
void CountSort(int* a,int n)
{
//找最大值和最小值
int max = a[0], min = a[0];
for (int i = 0; i < n; i++)
{
if (a[i] > max)
max = a[i];
if (a[i] < min)
min = a[i];
}
//找范围并创建数组
int range = max - min + 1;
int* tmp = (int*)malloc(sizeof(int) * range);
if (tmp == NULL)
{
perror("malloc fail\n");
return;
}
memset(tmp, 0, sizeof(int) * range);
//开始计数
for (int i = 0; i < n; i++)
{
tmp[a[i] - min]++;
}
//排序
int cur = 0;
for (int i = 0; i < range; i++)
{
while (tmp[i])
{
a[cur++] = i+min;
tmp[i]--;
}
}
free(tmp);
}
int main()
{
int a[20000];
srand((unsigned int)time(NULL));
for (int i = 0; i < 20; i++)
{
a[i] = rand() % 1000;
}
CountSort(a, 20);
/*for (int i = 0; i < 4; i++)
printf("%d ", a[i]);*/
int st = 0;
for (int i = 0; i < 18; i++)
{
if (a[i] > a[i + 1])
{
printf("%d->%d,%d\n", a[i], a[i + 1], i);
st = 1;
break;
}
}
if (st)
{
printf("out of order");
}
else
{
printf("order");
}
return 0;
}