计数排序是一个类似于桶排序的排序算法,其优势是对已知数量范围的数组进行排序。它创建一个长度为这个数据范围的数组C,C中每个元素记录要排序数组中对应记录的出现次数。非原址排序。
(1)思路:
计数排序算法的基本思想是对于给定的输入序列中的每一个元素x,确定该序列中值小于x的元素的个数。一旦有了这个信息,就可以将x直接存放到最终的输出序列的正确位置上。例如,如果输入序列中只有17个元素的值小于x的值,则x可以直接存放在输出序列的第18个位置上。
(2)复杂度分析:
(2.1)时间复杂度:
平均情况: O(n)。
(2.2)空间复杂度:
O(n)。
(3)稳定性:
计数排序是稳定的。注意从后向前入桶。
代码片段:
#include <stdio.h>
#define SIZE 8
void count_sort(int* A,int* B,int len,int k);
int main()
{
int A[SIZE]={2,5,3,0,2,3,0,3},B[SIZE];
count_sort(A, B, SIZE, 5); //5:数组元素最大值
return 0;
}
void count_sort(int* A,int* B,int len,int k)
{
const int C_len=9; //k+1
int C[C_len];
int i,value,pos;
for(i=0;i<=k;i++) //置0
{
C[i]=0;
}
for(i=0;i<len;i++) //统计各个桶中元素的个数
{
C[A[i]]++;
}
for(i=1;i<=k;i++) //count[i]表示桶的右边界索引
{
C[i]=C[i]+C[i-1];
}
for(i=len-1;i>=0;i--) //把数据依次装入桶B[],从后向前入桶保证计数排序稳定性
{
value=A[i];
pos=C[value];
B[pos-1]=value;
C[value]--;
}
}