python排序 堆排序

2021-09-29 03:52:16 字數 1979 閱讀 9660

樹是一種資料結構 比如:目錄結構

樹是一種可以遞迴定義的資料結構

樹是由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...