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