计数排序

本文介绍了计数排序的基本概念及其对负数和浮点数的扩展思路。对于负数,通过先处理正数再合并的方式进行排序;对于浮点数,目前尚未完成扩展。时间复杂度保持在O(n)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#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.对浮点数排序的扩展思路:暂未完成
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值