计数排序

  • 排序算法的下界
  • 计数排序

排序算法的下界

在一般的排序算法中,都是通过比较,确定元素之间的关系而确定顺序,
只要是比较就只有三种情况, “<”、“=”、“>”
我们将“<”、“=”放在一起,则只剩下两种情况 “<=”、“>”
这样想我们就可以就排序过程看成是决策树

这里写图片描述

这是一颗完全二叉树。

树的高 h>=lg(n!)=O(nlgn)

在最坏情况下,任何比较排序都需要做 Ω(nlgn) 次比较

计数排序

其实我们不用具体的知道一个数与其他数的关系,

对每一个输入元素,确定比其小的元素的个数

就能确定他的位置了。

public static void sort(int[] data){
        int len = data.length, max = data[0];
        int output[] = new int[len];
        for(int i = 1; i < len; i ++ ){
            if(data[i] > max){
                max = data[i];
            }
        }
        int c[] = new int[max + 1];
        for(int i = 0; i < len; i ++){
            c[data[i]] ++;
        }
        for(int i = 2; i <= max; i ++){
            c[i] = c[i] + c[i-1];
        }
        for(int i = len - 1 ; i >= 0 ; i --){
            output[c[data[i]]-1] = data[i];
            c[data[i]] --;
        }
        for(int i = 0; i < len; i ++){
            data[i] = output[i];
        }

    }

此方法中并没有比较,不管这个元素在此数组中是什么位置,她在整个数域中的位置是一定的,C数组就是这么一个数域,值确定了其在C中的索引,接下来的任务就是从前向后数数。一次扫描就够了。所以计数排序的时间复杂为线性即 O(n)


参考文献

[1] 算法之道
[2] 算法导论

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值