資料結構與演算法之美學習筆記 第二十八講

2022-09-05 02:39:10 字數 2061 閱讀 6986

對於每個節點的值都大於等於子樹中每個節點值的堆

對於每個節點的值都小於等於子樹中每個節點值的堆

從圖中我們可以看到:

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...