python實現堆排序

理論知識:

  

  二叉樹:度不超過2的樹(節點最多有兩個叉)

  滿二叉樹:一個二叉樹,若是每個層的節點數都達到最大值,則這個二叉樹就是滿二叉樹。

  徹底二叉樹:葉節點只能出如今最下層和次下層,而且最下面一層的節點都集中在該層最左邊的若干位置的二叉樹。

  大頂堆:一顆徹底二叉樹,知足任一節點都比其孩子節點大。

  小頂堆:一顆徹底二叉樹,知足任一節點都比其孩子節點小。

 

建堆過程
  1.創建堆
  2.獲得堆頂元素,將堆最後一個元素放到堆頂,此時可經過一次調整從新使堆有序
  3.堆頂元素爲第二大元素
  4.重複步驟3,知道堆變空

 

import random

def sift(li, low, high): tmp
= li[low] i = low j = 2 * i + 1 while j <= high: # 狀況2:i已是最後一層了 if j + 1 <= high 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 heap_sort(li): # 1.建堆 n = len(li) for low in range(n//2-1, -1, -1): sift(li, low, n-1) # 2. 挨個輸出 退休-棋子-調整 重複n次或n-1次 for high in range(n-1, -1, -1): li[0], li[high] = li[high], li[0] sift(li, 0, high-1) li = list(range(100000)) random.shuffle(li) heap_sort(li)

 

 

python自帶模塊html

import heapq
# priority queue

# li = [5,7,9,8,4,1,6,2,3]
# heapq.heapify(li)
# heapq.heappush(li, 0)
# print(heapq.heappop(li))
#
# print(li)

# print(heapq.nlargest(5, [1,2,5,4,7,8,9,6,3]))

 

轉載於:https://www.cnblogs.com/xiao-xue-di/p/10124153.htmlpython