计数排序不同于我们前面学到的排序,它是一种非比较排序,适用于序列中的元素较为密集分布且为整数的情况。
计数排序的思路:
1、求出序列中的最大值max和最小值min,开辟一个数组count(其元素个数为range(range=max-min+1))并初始化为0;
2、把序列中的数与数组的下标一一对应(序列中的数减去min就为对应数组的下标),每对应一次其下标对应的数组元素+1;
3、最后把数组count中非0元素对应的下标+min放入原数组就好了。
图解:
代码如下:
void CountSort(int* a, int n)
{
int min=a[0], max = a[0];
for (int i = 0; i < n; i++)
{
if (a[i] < min)
min = a[i];
if (a[i] > max)
max = a[i];
}
int range = max - min + 1;
int* count = (int*)malloc(sizeof(int) * range);
memset(count, 0, sizeof(int) * range);
for (int i = 0; i < n; i++)
{
count[a[i] - min]++;
}
int j = 0;
for (int i = 0; i < range; i++)
{
while (count[i]--)
{
a[j++] = i+min;
}
}
free(count);
}
void TestCountSort()
{
int a[] = { 6,1,2,7,9,3,4,5,10 ,8 };
CountSort(a, sizeof(a) / sizeof(int));
PrintArray(a, sizeof(a) / sizeof(int));
}
计数排序的时间复杂度为O(n+range),空间复杂度为O(n+range),具有稳定性。