堆排序的python實現及時間複雜度分析

2021-09-05 12:30:58 字數 1335 閱讀 7258

堆是一種形如二叉樹的抽象資料結構,要求根節點的元素大於(小於)左右子樹的節點,左右子樹也需滿足上述條件,是一種遞迴定義。

堆排序的python實現,主要分為兩大部分:

1.根據原始陣列建立初始堆,只需要從最後乙個父節點(陣列的中間元素)開始向前逐一進行修改,修改是將其與後面的元素進行比較,交換。位於陣列中間元素之後的元素看作樹的葉子結點無需進行校正。這部分時間複雜度o(n) ;

2.每次交換列表的首尾元素,使得堆頂的最大(或最小)元素依次移到陣列尾端,原來位於尾端的元素放到堆頂進行重新調整,每次迭代待排序陣列長度-1,這樣大頂堆最後會變成遞增序列,小頂堆最後會變成遞減序列。這部分時間複雜度o(nlogn)

時間複雜度分析見後面。應用:可用於求解最小的k個數等問題。

def heap_build(ls, start, length): #建立最大堆

cur = ls[start]

i = start

j = 2 * i + 1

while j < length:

if j < length-1 and ls[j+1] > ls[j]: #選出左子節點和右子節點中較大的

j += 1

if cur < ls[j]:

ls[i] = ls[j]

i = j

j = 2*i+1

else: #否則不用再繼續向下部伸展

break

ls[i] = cur

def swap(ls, i, j):

ls[i], ls[j] = ls[j], ls[i]

return ls

def heap_sort(ls):

length = len(ls)

for i in range(length//2, -1, -1): #初始化建堆

heap_build(ls,i,length)

#-----開始排序,每次拿掉頭節點後,重新排序--------

for i in range(0,length-1):

ls = swap(ls, 0, length-1-i) #每次拿走列表最前面的元素(當前最大值)放在列表尾端,最後形成乙個遞增序列。

heap_build(ls, 0, length-1-i)

return ls

時間複雜度分析:

空間複雜度: o(1) 原地排序

堆排序的Python實現

堆排序主要包含兩個部分 堆建立和堆調整。以下是最大堆 def max heapify heap,heapsize,root 對乙個父節點及其左右孩子節點調整 heap list heapsize 做陣列最大限制,root 根節點位置 left 2 root 1 注意此處下標從0開始,下標為1開始時,...

堆排序的python實現

如圖所示,堆類似於一棵二叉樹,每個節點最多有兩個子結點,根據堆的特點,又分為大頂堆和小頂堆。對於大頂堆,每個結點的值均大於其子結點的值,小頂推則恰恰相反,每個結點的值均小於其子結點的值。而對排序結構雖然類似於二叉樹,不過確是在列表結構上實現排序的,當結點 i 存在子結點時,其左子結點的索引必定為2i...

堆排序的python實現

def max heapify heap,heapsize,root left 2 root 1 right left 1 larger root if left heapsize and heap larger heap left larger left if right heapsize and...