方法1:
使用python自带heapq模块
import heapq
import random
randomlist = [random.randint(0, 100) for _ in range(10)]
#将randomlist所有数变负数,
newlist = [-x for x in randomlist]
#借助heapq,生成负数最小数的小顶堆
heapq.heapify(newlist)
#将负数的小顶堆取反,即是大顶堆
maxheaplist = [-x for x in newlist]
print(maxheaplist)
##方法2:
自己写函数,
class heap():
def __init__(self, data=[]):
self.data = data
def add(self, e):
idx = len(self.data)
self.data.append(e)
parent_idx = (idx - 1) // 2
while parent_idx >= 0:
if self.data[idx] > self.data[parent_idx]:
self.data[parent_idx], self.data[idx] = self.data[idx], self.data[parent_idx]
idx = parent_idx
parent_idx = (idx - 1) // 2
else:
break
def heapify(self, list):
self.data = list
n = len(self.data)
for idx in reversed(range(n // 2)): # reversed:返回一个反转的迭代器。
#从n//2到0, 做大顶堆
self._shiftDown(self.data, n, idx)
def _shiftDown(self, arr, n, parent_idx):
while 2 * parent_idx + 1 < n:
biggest_idx = 2 * parent_idx + 1
#比较左右子节点大小
if biggest_idx + 1 < n and arr[biggest_idx + 1] > arr[biggest_idx]:
biggest_idx += 1
#比较子节点与父节点大小
if arr[parent_idx] >= arr[biggest_idx]:
break
#若子节点较大,交换数值和位置;将子节点变成父节点,再次向下比较
arr[parent_idx], arr[biggest_idx] = arr[biggest_idx], arr[parent_idx]
parent_idx = biggest_idx
def heapSort(self):
n = len(self.data)
self.heapify(self.data)
for i in range(n - 1):
#将最大数与最后一位数交换,用“n - i - 1”个数做大顶堆
self.data[n - i - 1], self.data[0] = self.data[0], self.data[n - i - 1]
self._shiftDown(self.data, n - i - 1, 0)
def show(self):
return self.data
import random
randomlist = [random.randint(0, 100) for _ in range(10)]
heap1 = heap()
heap1.heapify(randomlist)
heap1.add(random.randint(0, 100))
print(heap1.show()) #输出大顶堆
heap1.heapSort()
print(heap1.show()) #输出排序后数列