计数排序(Counting sort)是一种稳定的线性时间排序算法。计数排序需要使用一个额外的数组count,其中第i个元素是待排序数组a的值减去a中最小值的值等于i是元素个数。然后根据数组count来将a中的元素排到正确的位置。
算法步骤如下:
1.找出待排序数组中的最大值和最小值;
2.开辟一个大小为m(上面求出的最大值减最小值再加1)的数组count,并将数组中的数据初始化为0;
3.统计数组中每个值减去最小值的值的出现次数,存入数组count相应的位置;
4.反向填充目标数组:将每个元素i+min(最小值)放在数组a[j]中,每放一个元素就将count[i]减去1。直到数组count中的每个元素为0。
过程如下:
具体代码如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
void Countsort(int* a, int n) {
int max = a[0], min = a[0];
for (int i = 1; i < n; i++) {
if (a[i] > max) {
max = a[i];
}
if (a[i] < min) {
min = a[i];
}
}
int m = max - min+1;//count数组开辟的大小
int* count = (int*)calloc(m, sizeof(int));
if (count == NULL) {
perror("calloc fail!");
return;
}
for (int i = 0; i < n; i++) {
count[a[i] - min]++;
}
int j = 0;
for (int i = 0; i < m; i++) {
while (count[i]>0) {
a[j] = min + i;
j++;
count[i]--;
}
}
free(count);
count = NULL;
}
int main()
{
int a[] = { 10,11,12,10,15,14,11,14 };
int n = sizeof(a) / sizeof(int);
Countsort(a, n);
for (int i = 0; i < n; i++) {
printf("%d ", a[i]);
}
return 0;
}