堆排序
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)