樹是一種資料結構 比如:目錄結構
樹是一種可以遞迴定義的資料結構
樹是由n個節點組成的集合:
二叉樹 度不超過2的樹
每個節點最多有兩個孩子節點
兩個孩子節點被區分為左孩子節點和右孩子節點
滿二叉樹
完全二叉樹
堆的向下調整
假設:節點的左右子樹都是堆,但自身不是堆
當根節點的左右子樹都是堆時,可以通過一次向下的調整來將其變換成乙個堆
建立堆得到堆頂元素,為最大元素
去掉堆頂,將堆最後乙個元素放到堆頂,此時可通過一次調整重新使堆有序
堆頂元素為第二大元素
重複步驟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 +
1else
:#tmp更大,把tmp放到i的位置上
# li[i] = tmp # 把tmp放到某一級領導那兒
break
li[i]
= tmp # 把tmp放到葉子節點上
defhead_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
li =
[i for i in
range
(100)]
import random
random.shuffle(li)
print
(li)
head_sort(li)
print
(li)
sift函式–>logn,走樹的高度(深度)
head_sort函式–>nlogn
堆排序的時間複雜度:nlogn
python堆排序演算法 Python 堆排序
python 堆排序 堆排序 heapsort 是指利用堆這種資料結構所設計的一種排序演算法。堆積是乙個近似完全二叉樹的結構,並同時滿足堆積的性質 即子結點的鍵值或索引總是小於 或者大於 它的父節點。堆排序可以說是一種利用堆的概念來排序的選擇排序。largest i l 2 i 1 left 2 i...
堆排序python理解 堆排序Python實現
def heap sort nos global size size len nos print the size of the list is d size build heap size,nos for i in range size 1,0,1 nums 0 nums i nums i num...
python堆排序的庫 Python 堆排序
相關概念 堆是一種完全二叉樹,即按從上到下,從左到右生成的二叉樹。堆有兩種型別 大根堆,小根堆。大根堆 每個結點的值都大於或等於左右孩子結點。小根堆 每個結點的值都小於或等於左右孩子結點。計算某個節點的父節點和兩個子節點 如上圖,選取3這個節點,他的序號 i 3 父節點 parent i 1 2 1...