python排序演算法之堆排序

2021-10-06 23:17:59 字數 3722 閱讀 6735

堆是種完全二叉樹,每個結點的值都大於或等於其左右孩子結點值的堆稱為大頂堆;反之,每個結點的值都小於或等於其左右孩子結點的值稱為小頂堆。

堆排序是利用堆這種資料結構而設計的一種排序演算法,堆排序複雜度均為o(nlogn)。當堆父節點的下標為i時,其左孩子的下標為2i+1,右孩子的下標為2i+2,

大頂堆:arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2]

小頂堆:arr[i] <= arr[2i+1] && arr[i] <= arr[2i+2]

堆排序的基本思想是:將待排序序列構造成乙個大頂堆或小頂堆,此時,整個序列的最大值或最小值就是堆頂的根節點。將其與末尾元素進行交換,此時末尾就為最大值或最小值。然後將剩餘n-1個元素重新構造成乙個堆,這樣會得到n-1個元素的次小值。如此反覆執行,便能得到乙個有序序列了

構造初始堆

元素出堆

a.大頂堆出公升序序列

將堆頂元素與末尾元素進行交換,無需建立新列表。

import random

num_list =[30

,80,-

20,40,

60,20,

50,5,

-20,-

5,10]

length=

len(num_list)

defb_dui_sort

(num_list,low,high)

: temp = num_list[low]

i= low

j =2*i+

1while j <= high:

if j+

1<=high and num_list[j]

: j=j+

1if num_list[j]

>temp:

num_list[i]

=num_list[j]

i=jj =

2*i+

1else

:break

num_list[i]

= temp

defb_heap_sort

(num_list)

: n=length

# 構建堆

for low in

range

(n//2-

1,-1

,-1)

: b_dui_sort(num_list, low, n-1)

for high in

range

(n-1,-

1,-1

):num_list[0]

,num_list[high]

=num_list[high]

,num_list[0]

b_dui_sort(num_list,

0, high-1)

return num_list

print

(b_heap_sort(num_list)

)

b.大頂堆出降序序列

新建列表儲存每次調整堆後最大的數即可

import random

num_list =[30

,80,-

20,40,

60,20,

50,5,

-20,-

5,10]

length=

len(num_list)

defb_dui_sort

(num_list,low,high)

: temp = num_list[low]

i= low

j =2*i+

1while j <= high:

if j+

1<=high and num_list[j]

: j=j+

1if num_list[j]

>temp:

num_list[i]

=num_list[j]

i=jj =

2*i+

1else

:break

num_list[i]

= temp

defb_heap_sort

(num_list)

: n=length

# 構建堆

new_num_list=

list()

for low in

range

(n//2-

1,-1

,-1)

: b_dui_sort(num_list, low, n-1)

for high in

range

(n-1,-

1,-1

):0]

) num_list[0]

,num_list[high]

=num_list[high]

,num_list[0]

b_dui_sort(num_list,

0, high-1)

return new_num_list

print

(b_heap_sort(num_list)

)

c.小頂堆出降序序列

和大頂堆出公升序序列一樣,將堆頂元素與末尾元素進行交換,無需建立新列表。

import random

num_list =[30

,80,-

20,40,

60,20,

50,5,

-20,-

5,10]

length=

len(num_list)

defs_dui_sort

(num_list,low,high)

: temp = num_list[low]

i= low

j =2*i+

1while j <= high:

if j+

1<=high and num_list[j]

>num_list[j+1]

: j=j+

1if num_list[j]

num_list[i]

=num_list[j]

i=jj =

2*i+

1else

:break

num_list[i]

= temp

defs_heap_sort

(num_list)

: n=length

# 構建堆

for low in

range

(n//2-

1,-1

,-1)

: s_dui_sort(num_list, low, n-1)

for high in

range

(n-1,-

1,-1

):num_list[0]

,num_list[high]

=num_list[high]

,num_list[0]

s_dui_sort(num_list,

0, high-1)

return num_list

print

(s_heap_sort(num_list)

)

Python排序演算法之堆排序

step1 構建堆 從最後乙個非葉子結點開始向下調整,使其成為乙個堆 step2 挨個出數 堆構建完後,得到堆頂,即為最大的元素 1 將堆頂和堆的最後乙個元素互換 2 再使用向下調整,使其成為乙個新堆 3 調整完成後,得到第二大的元素 4 從 1 開始重複,直到堆為空最壞情況 o nlogn 平均情...

python堆排序演算法 Python 堆排序

python 堆排序 堆排序 heapsort 是指利用堆這種資料結構所設計的一種排序演算法。堆積是乙個近似完全二叉樹的結構,並同時滿足堆積的性質 即子結點的鍵值或索引總是小於 或者大於 它的父節點。堆排序可以說是一種利用堆的概念來排序的選擇排序。largest i l 2 i 1 left 2 i...

排序演算法之堆排序

前言 今天我來介紹下堆排序,在寫堆排序 之前,我們要知道堆的概念!堆的定義 n個關鍵字序列kl,k2,kn稱為 heap 當且僅當該序列滿足如下性質 簡稱為堆性質 1 ki k 2i 且ki k 2i 1 1 i n 當然,這是小根堆,大根堆則換成 號。k i 相當於二叉樹的非葉子結點,k 2i 則...