2022更文挑战22-计数排序

116 阅读2分钟

「这是我参与2022首次更文挑战的第22天,活动详情查看:2022首次更文挑战」。

计数排序

前文

本文为个人对于计数排序相关知识的总结,因存在个人观点,不代表权威,难免有不足之处,如果存在还请见谅。

计数排序

计数排序,顾名思义肯定与数据的数量纪录有关。它不是一种传统方式的比较排序的算法,而是另一种依靠计数实现的排序算法。计数排序首先需要对给定的待排序队列进行一次遍历,得到队列中的最大值及最小值。然后我们需要指定一个map结构的数据容器。以上述最小值及最大值所构成的范围区间的每个值作为键,这样就形成了若干值为0,键为上述指定好区间数字的数据容器。然后再对数据队列进行遍历,当遍历到每个数字时,将数据容器对应的键的值加一。这样当整个队列被遍历完毕,即可得到一个数据容器,其中键为已知队列的数值,值为该数值在队列中总计出现的次数。

下一步需要对数据容器进行遍历,按照从小到大的范围,根据数据对应值的大小,决定在目标队列中,当前键出现的总次数。这样当整个数据容器遍历完毕,即在目标队列中已经存储了排好顺序的数据。按照这个方式,不需要进行排序的比较操作,只需要进行数据的纪录。也正是如此,便突破了o(nlog2n)的比较时间复杂度极限。

    public void sort(int[] list){
        //最大最小值纪录
        int max;
        int min;
        //数据放入容器
        HashMap<int,int> map;
        for(int i = 0;i < list.length;i++){
            //数据放入容器
        }
        //对容器进行遍历得到目标的排序结果
    }

计数排序的伪代码如上所示。对于计数排序来说,时间复杂度为o(n+k),是一种典型的空间换时间的排序算法。

后记

  • 千古兴亡多少事?悠悠。不尽长江滚滚流。