Python 堆及堆排序实现
堆(heap),又被为优先队列(priority queue), 是一种经过排序的完全二叉树,其任一非叶子节点的值均不大于(或不小于)其左孩子和右孩子节点的值。
将 个元素逐一插入到一个空堆中,时间复杂度是 ;
heapify()
的过程,时间复杂度是 ,[参考];
class Heap(object):
def __init__(self) -> None:
self.data_list = []
def get_parent_index(self, index):
if index == 0 or index > len(self.data_list) - 1:
return None
else:
return (index - 1) >> 1
def swap(self, index_0, index_1):
self.data_list[index_0], self.data_list[index_1] = self.data_list[index_1], self.data_list[index_0]
def insert(self, data):
self.data_list.append(data)
index = len(self.data_list) - 1
parent = self.get_parent_index(index)
while parent is not None and self.data_list[parent] < self.data_list[index]:
self.swap(parent, index)
index = parent
parent = self.get_parent_index(index)
def remove_max(self):
remove_data = self.data_list[0]
self.data_list[0] = self.data_list[-1]
del self.data_list[-1]
self.heapify(0, len(self.data_list) - 1)
return remove_data
def heapify(self, index, total_index):
while True:
maxvalue_index = index
if 2 * index + 1 <= total_index and self.data_list[2 * index + 1] > self.data_list[maxvalue_index]:
maxvalue_index = 2 * index + 1
if 2 * index + 2 <= total_index and self.data_list[2 * index + 2] > self.data_list[maxvalue_index]:
maxvalue_index = 2 * index + 2
if maxvalue_index == index:
break
self.swap(index, maxvalue_index)
index = maxvalue_index
def heap_init(self):
len_heap = len(self.data_list)
# Build a maxheap.
for i in range(len_heap - 1, -1, -1):
self.heapify(i, len_heap - 1)
def heap_sort(self):
self.heap_init()
len_heap = len(self.data_list)
# Sort
for i in range(len_heap - 1, 0, -1):
self.data_list[0], self.data_list[i] = self.data_list[i], self.data_list[0]
self.heapify(0, i - 1)
arr = [ 12, 11, 13, 5, 6, 7, -1]
heap = Heap()
heap.data_list = arr[:]
heap.heap_init()
# heap.heap_sort()
print(arr)
while len(heap.data_list) > 0:
max_data = heap.remove_max()
print(max_data)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现