1.计数排序的概念
计数排序是一个非比较的排序算法,它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n+k)(其中k是整数的范围),快于任何比较排序算法。 这是一种牺牲空间换取时间的做法,而且当O(k)>O(nlog(n))的时候其效率反而不如归并排序、快排、堆排。
2.排序思想
利用数组的索引是有序的,通过将序列中的元素作为索引,其个数作为值放入数组,遍历数组来排序。
3.gif图解
4.适用场景
数据元素集中(范围小),数据量大。
5.代码实现
void CountSort(int a[], int len)
{
int max = a[0], min = a[0];
for (int i = 1; i < len; i++)
{
if (a[i] > max)
{
max = a[i];
}
if (a[i] < min)
{
min = a[i];
}
}
int range = max - min;//数据范围为max-min,数据个数为max-min+1
int* countArray = (int*)malloc(sizeof(int) * (range + 1));
if (countArray == NULL)
{
perror("malloc()");
exit(-1);
}
for (int i = 0; i < range + 1; i++)
{
countArray[i] = 0;
}
for (int i = 0; i < len; i++)
{
countArray[a[i] - min]++;
}
//排序
int j = 0;
for (int i = 0; i <= range; i++)
{
while (countArray[i]--)
{
a[j++] = i + min;
}
}
free(countArray);//释放空间
}
开辟数组数据范围[min,range = max - min];数组大小:max - min + 1;
假设max = 109,min = 100;数据范围就是[100, 109],数组大小是10个元素。
时间复杂度:O(n+k),k表示数据范围。