利用堆排序
- 小根堆
- 时间复杂度O(mlogk)
# 小根堆
def sift_small(li,top,end):
tmp = li[top]
i = top
j = 2*i + 1
while j <= end:
if j + 1 <= end 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):
# 1、构造堆
heap = li[0:k]
for i in range((k-2)//2,-1,-1):
sift_small(heap,i,k-1)
# 2、遍历换堆顶
for i in range(k,len(li)):
if li[i] > heap[0]:
heap[0] = li[i]
sift_small(heap, 0, k - 1)
# 3、挨个出数
for i in range(k-1,-1,-1):
heap[0],heap[i] = heap[i],heap[0]
sift_small(heap,0,i-1)
return heap