美文网首页
计数排序

计数排序

作者: 吕艳凯 | 来源:发表于2019-12-11 17:35 被阅读0次

    假设数组中有20个随机整数,取值范围为0~10,要求用最快的速度把这20个整数从小到大进行排序。
    如何给这些无序的随机整数进行排序呢?
    考虑到这些整数只能够在0、1、2、3、4、5、6、7、8、9、10这11个数中取值,取值范围有限。所以,可以根据这有限的范围,建立一个长度为11的数组。数组下标从0到10,元素初始值全为0。


    image.png

    假设20个随机整数的值如下所示。
    9,3,5,4,9,1,2,7,8,1,3,6,5,3,4,0,10,9 ,7,9
    下面就开始遍历这个无序的随机数列,每一个整数按照其值对号入座,同时,对应数组下标的元素进行加1操作。
    例如第1个整数是9,那么数组下标为9的元素加1。


    image.png
    第2个整数是3,那么数组下标为3的元素加1。
    image.png
    继续遍历数列并修改数组……
    最终,当数列遍历完毕时,数组的状态如下。
    image.png

    有了这个统计结果,排序就很简单了。直接遍历数组,输出数组元素的下标值,元素的值是几,就输出几次。
    0,1,1,2,3,3,3,4,4,5,5,6,7,7,8,9,9,9,9,10
    显然,现在输出的数列已经是有序的了。
    具体代码如下:

    class Code{
    
        function countSort($arr){
            //1.求数组最大值
            $intMax = $arr[0];
            foreach ($arr as $key => $value) {
                if($value > $intMax){
                    $intMax = $value;
                }
            }
            //2.根据数列最大值确定统计数组的长度
            $arrCount = array();
            for ($i=0; $i < $intMax+1; $i++) { 
                $arrCount[$i] = 0;
            }
            //3.遍历数列,填充统计数组
            foreach ($arr as $key => $value) {
                $arrCount[$value]++;
            }
            //4.遍历统计数组,输出结果
            $arrReturn = array();
            foreach ($arrCount as $key => $value) {
                for($i=0;$i<$value;$i++){
                    $arrReturn[] = $key;
                }
            }
            return $arrReturn;
        }
    
        //运行
        function run(){
            $arr = array(8,5,7,4,2,0,1,3,9);
            $arr = $this->countSort($arr);
            print_r($arr);
        }
        
    }
    $obj = new Code();
    $obj->run();
    

    输出结果:


    image.png

    计数排序优化:
    只以数列的最大值来决定统计数组的长度,其实并不严谨。例如下面的数列。
    95,94,91,98,99,90,99,93,91,92
    这个数列的最大值是99,但最小的整数是90。如果创建长度为100的数组,那么前面从0到89的空间位置就都浪费了!
    很简单,只要不再以输入数列的最大值+1作为统计数组的长度,而是以数列最大值-最小值+1作为统计数组的长度即可。

    相关文章

      网友评论

          本文标题:计数排序

          本文链接:https://www.haomeiwen.com/subject/alhagctx.html