1 import random
2
3
4 def sift(li, low, high):
5 if low < high:
6 i = low
7 j = 2 * i + 1
8 temp = li[low]
9 while j <= high:
10 if j+1 <= high and li[j+1] > li[j]:
11 j += 1
12 if temp < li[j]:
13 li[i] = li[j]
14 i = j
15 j = 2 * i + 1
16 else:
17 break
18 li[i] = temp
19
20
21 def heap_sort(li):
22 # 1.建立堆
23 # 2,堆头放到堆尾
24 tail = len(li) - 1
25 header = 0
26 last_fa = (tail-1) // 2
27 for i in range(last_fa, -1, -1):
28 sift(li, i, tail)
29 for i in range(len(li)):
30 li[header], li[tail] = li[tail], li[header]
31 tail -= 1
32 sift(li, 0, tail)
33
34
35 def sift_desc(li, low, high):
36 i = low
37 j = 2 * i + 1
38 temp = li[low]
39 while j <= high:
40 if j+1 <= high and li[j+1] < li[j]:
41 j += 1
42 if temp > li[j]:
43 li[i] = li[j]
44 i = j
45 j = 2 * i + 1
46 else:
47 break
48 li[i] = temp
49
50
51 # 前k个元素
52 def topk(li, k):
53 heap = li[:k]
54 tail = k - 1
55 last_fa_k = (tail-1) // 2
56 for i in range(last_fa_k, -1, -1):
57 sift_desc(heap, i, tail)
58 print(heap)
59 for i in range(tail+1, len(li), 1):
60 if li[i] > heap[0]:
61 heap[0] = li[i]
62 sift_desc(heap, 0, tail)
63 for i in range(tail, -1, -1):
64 heap[0], heap[i] = heap[i], heap[0]
65 sift_desc(heap, 0, i-1)
66 print(heap)
67
68
69 if __name__ == '__main__':
70 li = [i for i in range(200)]
71 random.shuffle(li)
72 print(li)
73 topk(li, 10)
74 # heap_sort(li)
75 print(li)