计数排序(Counting sort)是一种稳定的排序算法。计数排序使用一个额外的数组C,其中第i个元素是待排序数组A中值等于i的元素的个数。然后根据数组C来将A中的元素排到正确的位置。
最差时间复杂度 | |
---|---|
最优时间复杂度 | |
平均时间复杂度 | |
最差空间复杂度 |
算法的步骤如下:
- 找出待排序的数组中最大和最小的元素 (下文中蓝色字体)
- 统计数组中每个值为i的元素出现的次数,存入数组C的第i项 (下文中紫色字体)
- 对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加) (下文中橙色字体)
- 反向填充目标数组:将每个元素i放在新数组的第C(i)项,每放一个元素就将C(i)减去1 (下文中红色字体)
c语言实现
int main()
{
int a[5]={4,1,3,4,3}; //input array
int b[5]; //output array
int i,min,max;
/*the main function*/
min=max=a[0];
for(i=0;i<5;i++) {
if(min>a[i])
min=a[i];
if(max<a[i])
max=a[i];
}
int c[max-min+1]; //temp array
for(i=0;i<max-min+1;i++)
c[i]=0;
for(i=0;i<5;i++) {
c[a[i]-1]+=1;
}
for(i=1;i<max-min+1;i++) {
c[i]=c[i-1]+c[i];
}
for(i=5-1;i>=0;i--) {
b[c[a[i]-1]-1]=a[i];
c[a[i]-1]-=1;
}
/*output the answer*/
for(i=0;i<5;i++)
printf("%d ",b[i]);
printf("\n");
return 0;
}