1. 程式人生 > >Python實現堆排序

Python實現堆排序

定義

堆排序(英語:Heapsort)是指利用堆這種資料結構所設計的一種排序演算法。堆是一個近似完全二叉樹的結構,並同時滿足堆積的性質:即子結點的鍵值或索引總是小於(或者大於)它的父節點。

堆節點的訪問

通常堆是通過一維陣列來實現的。在陣列起始位置為0的情形中:

父節點i的左子節點在位置 (2i+1); 父節點i的右子節點在位置 (2i+2); 子節點i的父節點在位置 floor((i-1)/2);

時間複雜度

圖來自wiki

實現

#Heap sort
class HeapSort:

	def __init__(self, lst):
		assert type(lst) == list or type(lst) == tuple
		self.lst = list(lst)
		self.type = type(lst)
	def sort(self):
		n = len(self.lst)
		for start in range((n - 2) // 2, -1, -1):
			self.max_heapify(start, n - 1)
		for end in range(n - 1, 0, -1):
			self.lst[0], self.lst[end] = self.lst[end], self.lst[0]
			self.max_heapify(0, end - 1)
		return self.type(self.lst)

	def max_heapify(self,start,end):
		root = start
		while True:
			child = 2 *root + 1
			if child > end:
				break
			if child + 1 <= end and self.lst[child] < self.lst[child + 1]:
				child += 1
			if self.lst[root] < self.lst[child]:
				self.lst[root], self.lst[child] = self.lst[child], self.lst[root]
				root = child
			else:
				break

測試

#test
a = (9,8,3,6,5,4,2,7,1)
p = HeapSort(a)
print(p.sort())