Python實現堆排序

2021-06-29 08:50:22 字數 1763 閱讀 6160

#! /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):

return

2*i+1

#求給定下標i的右孩子下標

defright

(self, i):

return

2*i+2

#維護堆的性質:遵循最大堆

defmaxheapify

(self, a, i, heap_size):

l=self.left(i)

r=self.right(i)

largest = i

if land a[l]>a[largest]:#下標從0~heap_size-1

largest=l

if rand a[r]>a[largest]:

largest=r

if largest!=i:#若當前節點不是最大的,下移

a[i], a[largest] = a[largest], a[i]#交換a[i]和a[largest]

self.maxheapify(a, largest, heap_size)#追蹤下移的節點

#建堆

defbuildmaxheap

(self, a):

heap_size=len(a)

for i in range(heap_size/2 - 1, -1, -1):#從最後乙個非葉節點開始調整

#a[heap_size/2 - 1]~a[0]都是非葉節點,其他的是葉子節點

self.maxheapify(a, i, heap_size)

#堆排序演算法

defheapsort

(self, a):

heap_size=len(a)

'''step1:初始化堆,將a[0...n-1]構造為堆(堆頂a[0]為最大元素)'''

self.buildmaxheap(a)

for i in range(len(a)-1, 0, -1):

#print a

'''step2:將當前無序區的堆頂元素a[0]與該區間最後乙個記錄交換

得到新的無序區a[0...n-2]和新的有序區a[n-1],有序區的範圍從

後往前不斷擴大,直到有n個'''

a[0], a[i] = a[i], a[0]#每次將剩餘元素中的最大者放到最後面a[i]處

heap_size -= 1

'''step3:為避免交換後新的堆頂違反堆的性質,因此將新的無序區調整為新

的堆'''

self.maxheapify(a, 0, heap_size)

if __name__ == '__main__':

h = heap()

x = [0, 2, 6, 98, 34, -5, 23, 11, 89, 100, 4]

x1= [3,9,8,4,5,2,10,18]

h.heapsort(x)

h.heapsort(x1)

print x

print x1

堆排序python實現

因為部門頻繁調整,半年多時間直接上級換了三個,之前一起工作的同事被調離的時候大頭沒有放我過去,說還有業務讓我支撐,在這次調整大頭也被調走了,現在小團隊的業務已經不再重要,人也都是一些老弱病殘,並且技術路線也與部門大團隊完全不同,因此,最近想換乙個公司或者部門來尋找更好的發展。當我前幾天到公司另乙個部...

python 實現堆排序

原理 迴圈陣列,依次構建最大堆,構建完以後第乙個元素就為最大值 swap 到最後乙個位置,繼續對 陣列中 0 last 1 這個新陣列構建最大堆 依次類推 到最後構建完成 arr 55,67,89,12,4,6,2,34,33,12 arrlen int len arr 調整三個元素堆 defadj...

堆排序 python實現

利用堆實現排序的簡單思路是,利用堆頂元素總是最大或者最小的性質,每次彈出乙個元素,直到堆空,則彈出元素形成的序列是有序的。但是為了節約儲存空間,我們直接將彈出的元素放在原堆記憶體的後面,這樣形成的最後形成的有序陣列的順序是和堆中資料的順序性是相反的 若是小根堆,排序後是由大到小的 若是大根堆,排序後...