堆排序

 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)

 

posted @ 2021-12-03 15:44  Avery_rainys  阅读(25)  评论(0)    收藏  举报