對於每個節點的值都大於等於子樹中每個節點值的堆
對於每個節點的值都小於等於子樹中每個節點值的堆
從圖中我們可以看到:
1、陣列中下標為 i 的節點的左子節點,就是下標為 i∗2 的節點,
2、右子節點就是下標為 i∗2+1 的節點,父節點就是下標為 i2 的節點。
1、堆化
2、從下往上的堆化方法
讓新插入的節點與父節點對比大小
1、讓新插入的節點與父節點對比大小
2、如果不滿足子節點小於等於父節點的大小關係、我們就互換兩個節點
3、一直重複這個過程,直到父子節點之間滿足剛說的那種大小關係。
從上往下的堆化方法
1.建立堆。
2.得到堆頂元素,為最大元素
3.去掉堆頂,將堆最後乙個元素放到堆頂,此時可通過⼀一次調整重新使堆有序。
4.堆頂元素為第二大元素。
5.重複步驟3,直到堆變空。
def sift(li, low, high):""":param li: 列表
:param low: 堆的根節點位置
:param high: 堆的最後乙個元素的位置
:return:
"""i = low # i最開始指向根節點
j = 2 * i + 1 # j開始是左孩子
tmp = li[low] # 把堆頂存起來
while j <= high: # 只要j位置有數
if j + 1 <= high and li[j+1] > li[j]: # 如果右孩子有並且比較大
j = j + 1 # j指向右孩子
if li[j] > tmp:
li[i] = li[j]
i = j # 往下看一層
j = 2 * i + 1
else: # tmp更大,把tmp放到i的位置上
li[i] = tmp # 把tmp放到某一級領導位置上
break
else:
li[i] = tmp # 把tmp放到葉子節點上
def heap_sort(li):
n = len(li)
for i in range((n-2)//2, -1, -1):
# i表示建堆的時候調整的部分的根的下標
sift(li, i, n-1)
# 建堆完成了
for i in range(n-1, -1, -1):
# i 指向當前堆的最後乙個元素
li[0], li[i] = li[i], li[0]
sift(li, 0, i - 1) #i-1是新的high
《資料結構與演算法之美》學習筆記 3 資料結構
陣列定義 陣列 array 是一種線性表資料結構。它用一組連續的記憶體空間,來儲存一組具有相同型別的資料。第一是線性表 linear list 顧名思義,線性表就是資料排成像一條線一樣的結構。每個線性表上的資料最多只有前和後兩個方向。除了陣列,鍊錶 佇列 棧等也是線性表結構。而與它相對立的概念是非線...
《資料結構與演算法之美》學習筆記之開篇
本系列是極客時間中前 google 工程師王爭 資料結構與演算法之美 專欄的學習筆記,想加強資料結構及演算法能力的同學可以直接購買此專欄,跳轉鏈結在此 從廣義上講,資料結構就是指一組資料的儲存結構。演算法就是運算元據的一組方法。資料結構和演算法是相輔相成的。資料結構是為演算法服務的,演算法要作用在特...
資料結構與演算法之美學習筆記 5 9章
陣列是一種線性表資料結構,他用一組連續的記憶體空間,來儲存相同型別的資料 這裡要注意不根據下標是不能隨機訪問的啊 假設乙個長度為10的int型陣列,會分配一塊連續記憶體空間 1000 1039,其中,記憶體塊首位址是1000 我們可以通過以下公式快速獲取到指定下標的元素 a i address ba...