堆排序的時間複雜度為:o(nlgn)
def
max_heapify
(lst,start,end)
:'''
建立最大堆
'''root = start
while
true
: child =
2* root +
1#左孩子
if child > end:
break
if child +
1<= end and lst[child]
: child +=
1if lst[root]
< lst[child]
: lst[root]
,lst[child]
= lst[child]
,lst[root]
root = child
else
:break
defheap_sort
(lst)
: first =
len(lst)
for start in
range
(first,-1
,-1)
: max_heapify(lst,start,
len(lst)-1
)for end in
range
(len
(lst)-1
,0,-
1): lst[0]
,lst[end]
= lst[end]
,lst[0]
max_heapify(lst,
0,end -1)
return lst
defmain()
: a =[5
,3,17
,10,84
,19,6
,22,9
]print heap_sort(a)
if __name__ ==
'__main__'
: main(
)
堆資料物件是一種陣列物件,它可以看作一顆完全二叉樹。
對於乙個堆陣列a,有兩個屬性:
1.length[a]:表示陣列中元素的個數
2.heap-size[a]:表示陣列a中存放的堆元素的個數
樹的根為a[1],給定某個結點的下標為i,則
父節點:parent[i] : i/2向上取整
左兒子:left[i]:2i
右兒子:right[i]:2i+1
堆分為:最大堆和最小堆
在堆排序中我們使用最大堆,最小堆一般用於構造優先佇列。
堆的乙個節點的高度:該節點到葉節點最長簡單路徑上邊的數目
乙個包含n個元素的堆的高度為o(lgn)
max-heapify用於維護最大堆。他的輸入為乙個陣列a和乙個下標i。在呼叫max-heapify的時候,我們假設left(i)和right(i)的二叉樹都是最大堆,但這時候的a[i]有可能小於他的孩子節點。max-heapify就是讓a[i]的值在最大堆中逐級下降,從而使得根節點為下標i的字數重新遵循最大堆的性質。
時間複雜度:o(lgn)
對n個元素的堆來說,lg(n)也是一棵樹的高度h,max-heapify的時間複雜度是o(h)
排序演算法(二) 堆排序
堆排序 堆是指每個節點值大於 小於其左右節點值的完全二叉樹,根節點一定是堆的所有節點中最大 小節點所在處 節點值大於左右節點值的堆叫大頂堆,根元素為整個堆的最大值。節點值小於左右節點值的堆 叫小頂堆。堆排序過程 1 將無序陣列構建成堆結構。2 將根節點值與最後乙個節點值互換,此時最後乙個節點值最大 ...
演算法二 堆排序
堆排序,其複雜的為nlog n include using namespace std 交換陣列下標為i,j的元素 void swap int tree,int i,int j 堆化,將陣列轉化為大頂堆 如 4,10,3 10,4,3 如果i節點進行了交換,為保證陣列的整個堆結構,必須對交換的節點繼...
排序二 堆排序
子結點的鍵值或索引總是小於 或者大於 它的父節點。堆通過一維陣列實現。在起始陣列為 0 的情形中 父節點i的左子節點在位置 2 i 1 父節點i的右子節點在位置 2 i 2 子節點i的父節點在位置 floor i 1 2 堆中的最大值總是位於根節點。堆中定義以下幾種操作 1 最大堆調整 max he...