【菜鸡刷题-NC119】找出其中最小的K个数 || 迭代堆排序|| 小顶堆 || python


@author = YHR | 代码原创 | 转载请标明来源



题目描述

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

在这里插入图片描述

方法代码

  1. 简单的排序 – 快排/ 冒泡/ 啥都可以
  2. 但本宝宝就想用【小顶堆】的【迭代】排序… 反复熟悉一下他,毕竟他可是最好最坏的时间复杂度都为 O(nlogN)的好算法~ ,此外 空间为O(1)哦~ 虽然他不稳定啦。

异常情况处理

       # 边界情况处理
        if len(tinput)<1:
            return []
        if k > len(tinput):
            return []

输出最小的K个数

        topkSmall = []
        for _ in range(k):
            self.smallHeap(tinput)  # 构建当前数组的小顶堆
            topkSmall.append(tinput.pop(0))  # 取出最小的数,数组发生变化!
        return topkSmall

构建当前数组的小顶堆

# 输入 tinput 为 list 类型的数组
def smallHeap(self, tinput):
        parentNode = len(tinput)//2 - 1  # 从父节点为数组长度//2 - 1 下标开始,倒序做
        for pnode in range(parentNode, -1, -1):
            temp = tinput[pnode]
            replacePtr = pnode  # replacePtr:目标要替换的位置
            comparePtr = replacePtr   # comparePtr:与replacePtr比较的位置
            while comparePtr < len(tinput):
                comparePtr = 2 * (replacePtr+1)-1  # 左孩子
                # 找到最小的孩子
                if comparePtr >= len(tinput):
                	# 没有左孩子
                    break
                if comparePtr + 1 < len(tinput):
                # 如果有右孩子
                    if tinput[comparePtr + 1] < tinput[comparePtr]:
                        comparePtr += 1  # 找到最小的孩子的下标
                if tinput[replacePtr] <= tinput[comparePtr]:
                    break
                else:
                    tinput[replacePtr] = tinput[comparePtr]
                    replacePtr = comparePtr
            tinput[replacePtr] = temp
        return tinput
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值