#include <stdio.h>
//计数排序要求输入的元素是0到k之间
void countSort(int a[], int b[], int array_size, int k)//k是a数组中最大的数
{
int c[k+1], i; //从0开始,所以是k+1
for(i = 0; i <= k; i++)
c[i] = 0;
for(i = 0; i < array_size; i++) //c数组里的值是a数组里的值的出现次数
c[a[i]]++;
for(i = 1; i <= k; i++)
c[i] = c[i] + c[i - 1]; //c数组里的值是小于等于该值(c数组的下标)的数量
for(i = array_size - 1; i >= 0; i--) //从后往前或从前往后都可以
{ //a数组里的值是c数组的下标
b[c[a[i]] - 1] = a[i]; //因为数组是从0开始,所以要c[a[i]] - 1
c[a[i]]--; //将一个值计入b数组后在c数组中小于等于该值的数量做相应改变
}
}
int main()
{
int a[8] = {2,5,3,0,2,3,0,3}, b[8], i;
countSort(a, b, 8, 5);
for(i = 0; i < 8; i++)
printf("%d ",b[i]);
return 0;
}
1.对负数排序的扩展思路:计数排序要求元素能够作为数组的下标,自然不能是负
数。我的思路是先把负数和非负数分离开来,对负数取绝对值,再对这两组数分
别计数排序,最后再把两组数合并可以了。时间复杂度依旧是O(n),只是n会大一点
。当然处理的都是整数。
2.对浮点数排序的扩展思路:暂未完成