1、堆的定義
滿足以下情形的資料結構:
情形1:ki
<= k2i 且ki
<= k2i+1 (最小化堆或小頂堆:左、右子孩子的值比父結點的值都大)
情形2:ki >= k2i 且ki >= k2i+1 (最大化堆或大頂堆:左、右子孩子的值比父結點的值都小)
2、堆排序
一般從小到大的排序利用大頂堆實現。基本思想為:
1、將初始待排序關鍵字序列構建成大頂堆
2、將堆頂元素r[1]與最後乙個元素r[n]交換,此時得到新的無序區(r1,r2,......rn-1)和新的有序區(rn),且滿足r[1,2...n-1]<=r[n];
3、由於交換後新的堆頂r[1]可能違反堆的性質,而其他節點均滿足堆的性質,因此只需要從堆頂開始對當前無序區(r1,r2,......rn-1)調整為新堆,然後再次將r[1]與無序區最後乙個元素交換,得到新的無序區(r1,r2....rn-2)和新的有序區(rn-1,rn)。不斷重複此過程直到有序區的元素個數為n-1,則整個排序過程完成。
3、堆的生成
葉節點不用調整,首先應該從最後乙個非子節點開始,即序號n/2-1節點。
def heapadjust(a,i,n):
while i*2+1a[j]:
j += 1
t = a[i]
if a[j]>t:
a[i] = a[j]
a[j] = t
i = j
else:
break
從n/2-1節點向前調整,至此生成乙個大頂堆。
i = length//2-1
a = tinput
while i>=0:
adjust(a,i,length)
i-=1
4、堆排序
將堆頂和最後乙個元素進行交換,然後對前面的元素進行調整。
t = a[0]
a[0] = a[length-1]
a[length-1] = t
n = length-1
while n>0:
heapadjust(a,0,n)
t = a[0]
a[0] = a[n-1]
a[n-1] = t
n-=1
完整**:
def adjust(a,i,n):
while i*2+1 < n:
j = i*2+1
t = a[j]
if j+1=0:
adjust(a,i,length)
i-=1
t = a[0]
a[0] = a[length-1]
a[length-1] = t
n = length-1
while n>0:
adjust(tinput,0,n)
t = a[0]
a[0] = a[n-1]
a[n-1] = t
n-=1
Python實現堆排序
usr bin env python coding utf 8 堆排序 class heap object 求給定下標i的父節點下標 defparent self,i if i 2 0 return i 2 1 else return i 2 求給定下標i的左孩子下標 defleft self,i ...
堆排序python實現
因為部門頻繁調整,半年多時間直接上級換了三個,之前一起工作的同事被調離的時候大頭沒有放我過去,說還有業務讓我支撐,在這次調整大頭也被調走了,現在小團隊的業務已經不再重要,人也都是一些老弱病殘,並且技術路線也與部門大團隊完全不同,因此,最近想換乙個公司或者部門來尋找更好的發展。當我前幾天到公司另乙個部...
python 實現堆排序
原理 迴圈陣列,依次構建最大堆,構建完以後第乙個元素就為最大值 swap 到最後乙個位置,繼續對 陣列中 0 last 1 這個新陣列構建最大堆 依次類推 到最後構建完成 arr 55,67,89,12,4,6,2,34,33,12 arrlen int len arr 調整三個元素堆 defadj...