# -*- coding:utf-8 -*- # 堆 class Heap(object): def __init__(self): self.dataList = [None] # 第一个元素设为 None 避免 0 下标 def size(self): return len(self.dataList) - 1 def leftChild(self, root): return root * 2 def rightChild(self, root): return root * 2 + 1 def father(self, node): return node / 2 def heapify(self, root): if root > self.size(): return leftNode = self.leftChild(root) rightNode = self.rightChild(root) largest = root if leftNode <= self.size(): # 防止这个点是叶子结点 if self.dataList[leftNode] > self.dataList[largest]: largest = leftNode if rightNode <= self.size(): # 防止这个点是叶子结点 if self.dataList[rightNode] > self.dataList[largest]: largest = rightNode if largest != root: self.dataList[root], self.dataList[largest] = self.dataList[largest], self.dataList[root] self.heapify(largest) def buildHeap(self): for i in range(self.size() / 2, 0, -1): # 从最后一个非叶子结点遍历 self.heapify(i) def getMax(self): if self.size() == 0: # 判断堆是否为空 return None ret = self.dataList[1] # 保存堆顶元素 self.dataList[1] = self.dataList[-1] # 把最后一位移到第一位 del self.dataList[-1] # 删除最后一位 self.heapify(1) # 重新建堆 return ret def insert(self, data): self.dataList.append(data) # 存到最后面 nowIndex = self.size() # 拿到下标(就是长度) pre = self.father(nowIndex) # 拿到父亲节点下标 while self.dataList[pre] < data and nowIndex != 1: # 遍历父节点 直到为根结点或者父节点比data大 self.dataList[pre], self.dataList[nowIndex] = self.dataList[nowIndex], self.dataList[pre] nowIndex = pre pre = nowIndex / 2 heap = Heap() heap.insert(9) heap.insert(10) heap.insert(7) heap.insert(12) heap.insert(3) heap.insert(4) # print heap.getMax() # print heap.getMax() # print heap.getMax() # print heap.getMax() # print heap.getMax() # print heap.getMax() # print heap.getMax() heap.insert(9) heap.insert(8) heap.insert(7) heap.insert(7) heap.insert(12) # print heap.getMax() heap.dataList = [None, 1, 2, 3, 4, 5, 6, 7] heap.buildHeap() # print heap.getMax()
分类: Python
0 条评论