计数排序

计数排序是一种稳定排序:对于相同值的元素在输出数组中的相对次序和输入数组中的次序相同。且它不是一种比较排序,时间复杂度为O(n).
计数排序原理:对于每一个输入元素x,确定出小于等于x的元素个数,将x放到所有小于等于x的位置后面,有重复的,则放置一个x以后,将元素个数减1,以便下一次继续放置。
代码如下:

void Insert::CountingSort(vector<int> &coll,vector<int> &coll2,int k)//temp传进来时元素为0,且个数和coll一样多,存放排序后的值,k为coll所有元素中的最大值+1(由于temp如果设为最大值,会溢出,需要加1).
{
    int count=coll.size();
    vector<int> temp(k,0);
    for(int i=0;i<count;++i)
    {
        temp[coll[i]]=temp[coll[i]]+1;//temp[coll[i]]为得到值为coll[i]的元素个数
    }
    for(int i=0;i<k;++i)
    {
        if(i>0)
        temp[i]=temp[i]+temp[i-1];//通过遍历,temp[i]可以得到小于等于coll中元素值为i的个数。因为如果i不为coll[i]得值时,temp[i]=0,没有影响。
                                 //因为从0开始遍历,所以得到的就是每个temp[i]的值为小于等于coll[i]的元素个数
    }
    for(int i=count-1;i>=0;--i)
    {
        coll2[temp[coll[i]]-1]=coll[i];//temp[coll[i]]为当前小于等于coll[i]的值的个数(个数总是<=待排序的数组元素个数),元素个数即放置该元素的位置,因为数组从0开始,所以减1。
        temp[coll[i]]=temp[coll[i]]-1;//承上面注释,例如小于等于5个,那么coll[4]就是其合适的位置,然后其个数减1,以便下一次遇见相同的值时进行赋值。
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值