堆是種完全二叉樹,每個結點的值都大於或等於其左右孩子結點值的堆稱為大頂堆;反之,每個結點的值都小於或等於其左右孩子結點的值稱為小頂堆。
堆排序是利用堆這種資料結構而設計的一種排序演算法,堆排序複雜度均為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 則...