计数排序

#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.对浮点数排序的扩展思路:暂未完成
点赞