@author = YHR | 代码原创 | 转载请标明来源
题目描述
输入n个整数,找出其中最小的K个数。
例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。
方法代码
- 简单的排序 – 快排/ 冒泡/ 啥都可以
- 但本宝宝就想用【小顶堆】的【迭代】排序… 反复熟悉一下他,毕竟他可是最好最坏的时间复杂度都为 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