最小的K个数

输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。

当大量数据排序后取前k个值,并且数据经常变化的时候堆排序非常有优势。

<?php
    $heaparr = array();
    function GetLeastNumbers_Solution($input, $k)
    {
        // write code here
        global $heaparr;
        $result = array();
        $heaparr = array(0);
        //构建完全二叉树   
        for($i = 1; $i<= count($input); $i++){
            $heaparr[] = $input[$i-1];
        }
        //2.调整所有的子树使得符合最小堆的特性,从最后一个非叶子节点开始找就行,下标是sum/2
        $max = count($input);
        
        for ($idx = round($max /2); $idx >=1; $idx--) {
            setNodeP($idx, $max);
        }
         //每次取走最上面的元素,然后把最大节点的元素放在顶部,重新调整,使得剩余的节点依旧满足最小堆的特性。
        for($i = 1; $i<= $k; $i++){
            $t = $heaparr[1];
            $heaparr[1]=$heaparr[$max];
            $max--;
            setNodeP(1, $max);
            $result[] = $t;
            
        }
        return $result;
    }
    function setNodeP($curIdx, $maxNode){
        global $heaparr;
        if($curIdx*2 > $maxNode) {
            return;
        }
        $t = $curIdx;
        if($heaparr[$curIdx]>$heaparr[$curIdx*2]){
            $t = $curIdx * 2;
        }
        if($curIdx*2+1 <=$maxNode) {
            if($heaparr[$t] > $heaparr[$curIdx*2+1]) {
                $t = $curIdx * 2 + 1;
            }
        }
        if($t!=$curIdx) {
            $tem = $heaparr[$curIdx];
            $heaparr[$curIdx] = $heaparr[$t];
            $heaparr[$t] = $tem;
            setNodeP($t, $maxNode);
        }
    }
    $result = GetLeastNumbers_Solution(array(3,2,1,0,-1),3);
    print_r($result);
?>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 最小的K个数 题目描述 输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最...
    echoVic阅读 4,200评论 1 2
  • 寻找最小的 k 个数 题目描述: 输入 n 个整数,输出其中最小的 k 个。 分析和解法: 解法一:排序输出 要求...
    MinoyJet阅读 3,680评论 0 0
  • 解法一 最容易想到的方法是先对元素进行排序,然后取出前k个数,总时间复杂度O(n*logN)。你一定注意到了,当k...
    书呆子的复仇阅读 9,276评论 2 1
  • 题目:输入n个整数,找出其中最小的k个数。例如输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、...
    Felicia1993阅读 3,003评论 0 0
  • 问题:输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,...
    单倍体阅读 3,570评论 0 0