python堆排序實現TOPK問題

# 構建小頂堆跳轉
def
sift(li, low, higt): tmp = li[low] i = low j = 2 * i + 1 while j <= higt: # 狀況2:i已是最後一層 if j + 1 <= higt and li[j + 1] < li[j]: # 右孩子存在而且小於左孩子 j += 1 if tmp > li[j]: li[i] = li[j] i = j j = 2 * i + 1 else: break # 狀況1:j位置比tmp小 li[i] = tmp def top_k(li, k): heap = li[0:k] # 建堆 for i in range(k // 2 - 1, -1, -1): sift(heap, i, k - 1) for i in range(k, len(li)): if li[i] > heap[0]: heap[0] = li[i] sift(heap, 0, k - 1) # 挨個輸出 for i in range(k - 1, -1, -1): heap[0], heap[i] = heap[i], heap[0] sift(heap, 0, i - 1) return heap li = [0, 8, 6, 2, 4, 9, 1, 4, 6] print(top_k(li, 3))