堆与堆排序
发布日期:2021-05-09 05:28:22 浏览次数:8 分类:博客文章

本文共 1738 字,大约阅读时间需要 5 分钟。

最大堆

class Array(object):    def __init__(self,size=32):        self._size = size        self._items = [None] * size        def __getitem__(self,index):        return self._items[index]    def __setitem(self,index,value):        self._items[index] = value        def __len__(self):        return self._size    def clear(self,value=None):        for _ in range(self._items):            self._items[_] = value        def iter(self):        for _ in self._items:            yield _    class MaxHeap(Array):	def __init__(self,maxsize=None):		self.maxsize = maxsize		self._elements = Array(maxsize)		self._count = 0		def __len__(self):		return self._count	def add(self,value):		if self._count >= self.maxsize:			raise Exception('Full of size')		 self._elements[self._count] = value		 self._count += 1		 self._siftup(self._count-1)	def _siftup(self,idx):		'''		用递归的方法满足最大堆的特性		'''		if idx > 0:			parent = (idx-1) // 2			if self._elements[idx] > self._elements[parent]:				self._elements[idx],self._elements[parent] = self._elements[parent],self._elements[idx]				self._siftup(parent)	def extract(self):		if self._count <= 0:			raise Exception("Empty!!")		value = self._elements[0]		self.clear -= 1		self._elements[0] = self._elements[self._count]		self._siftdown(0)		return value		def _siftdown(self,idx):		left = 2 * idx + 1		right = 2 * idx + 2		largest = idx				if (left < self._count and self._elements[left] >= self._elements[largest] and self._elements[left] > self._elements[right]):			largest = left		elif right < self._count and self._elements[right] >= self._elements[largest]:			largest = right				if largest != idx:			self._elements[largest],self._elements[idx] = self._elements[idx],self._elements[largest]			self._siftdown(largest)

上一篇:优先队列
下一篇:二叉树

发表评论

最新留言

关注你微信了!
[***.104.42.241]2025年04月19日 22时25分49秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章