import random def generate_big_root_heap(li,low,hight): i = low j = 2 * i + 1 tmp = li[i] while j <= hight: if j + 1 <= hight and li[j+1] > li[j]: j = j + 1 if li[j] > tmp: li[i] = li[j] i = j j = 2 * i + 1 else: break li[i] = tmp def generate_low_root_heap(li,low,hight): i = low j = 2 * i + 1 tmp = li[low] while j <= hight: if j + 1 <= hight and li[j+1] < li[j]: j = j + 1 if li[j] < tmp: li[i] = li[j] i = j j = 2 * i + 1 else: break li[i] = tmp def topk(li,k): heap = li[:k] for i in range((k-1-1)//2,-1,-1): generate_low_root_heap(heap,i,k-1) for i in range(k,len(li)-1): if li[i] > heap[0]: heap[0] = li[i] generate_low_root_heap(heap,0,k-1) for i in range(k-1,-1,-1): heap[i], heap[0] = heap[0], heap[i] generate_low_root_heap(heap,0,i-1) return heap def main(): li = [i for i in range(100)] random.shuffle(li) print(li) heap = topk(li,10) print(heap) if __name__ == '__main__': main()