算法导论——线性排序(一)计数排序

LeetCode 274 H指数,**基于比较的排序算法最优可以达到O(n*logn)的时间复杂度,算法导论中介绍了3种非基于比较的排序算法,时间复杂度可以达到线性。**LeetCode 274 是计数排序的典型应用,下面代码是中的注释比较详细,计数排序的思想并不复杂,如果忘记,请查看算法导论书籍。

class Solution {
public:
    int hIndex(vector<int>& citations) {
        vector<int> C(1001, 0);
        int size = citations.size();
        int ans = 0;
        vector<int> out(size, 0);

        //这里执行完C[i]是计数的功能
        for(int d : citations) C[d]++;
        //这里执行完C[i]表示小于i的数据个数
        for(int i = 1; i < 1001; i++) C[i] += C[i - 1 ];

        for(int i = size - 1; i >= 0; i--){
            int index = C[citations[i]] - 1;
            out[index] = citations[i];
            //这一行的目的是当citations中的数据有重复时起作用,由于是
            //从大到小遍历,这里决定了计数排序算法的稳定性
            C[citations[i]]--;
            /*
            if(citations[i] >= size - index){
                ans = size - index > ans ? size - index: ans;
            }
            */
        }

        //这个for循环可以使用上面注释掉的if代替
        for(int i = size - 1; i >= 0; i--){            
            if(out[i] >= size - i){
                ans = size - i > ans ? size - i : ans;
            }
        }
        return ans;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值