#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Tue Mar 16 11:56:42 2021
@author: xiangsong
"""
# heap 排序求最大的k个数
class Solution:
def GetLeastNumbers_solution(self, tininput, k):
# 建立一个大小为k的堆
heap = [0] * (k)
# 初始化堆数据
for i in range(k):
heap[i] = tininput[i]
# 建立k大小的大根堆 从0-k调整元素
for i in range(k):
self.heapInsert(heap, i)
arr = []
heapSize = len(heap)
#其余元素index
l = k
# 将较大的值 放到堆里面去
while l<len(tininput):
if heap[0] < tininput[l]:
heap[0] = tininput[l]
self.heapify(heap, 0, heapSize)
l+=1
# 知道tininput的其他元素和堆顶比较过, 此时堆就是由最大的k个数构成的大顶堆
#取出堆值!!! 直到堆为空
while heapSize>0:
arr.append(heap[0])
self.swap(heap, 0, heapSize)
heapSize -= 1
# 堆顶下沉
self.heapify(heap,0, heapSize)
def heapInsert(self, heap, index):
'''
堆底元素上浮!
'''
while heap[index] >heap[(index-1) / 2]:
self.swap(heap,index, (index-1) / 2)
index = (index-1) / 2
def heapify(self, heap,index, heapSize):
'''
堆顶元素下沉!
'''
left = 1
while left < heapSize:
# 找到自己和左右节点中最大的那个元素的索引
largest = left+1 if left+1 < heapSize and heap[left+1] >heap[left] else left
largest = index if heap[largest] < heap[index] else largest
if largest == index:# 最大的为自己,那么就不用下沉了
break
# 否则 继续下沉
self.swap(heap, largest, index)
#更新下浮节点索引
index = largest
#更新孩子索引
left = index * 2 + 1