堆排序詳解 python實現

2021-08-15 16:03:10 字數 1616 閱讀 4163

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...