Python 堆及堆排序实现

堆(heap),又被为优先队列(priority queue), 是一种经过排序的完全二叉树,其任一非叶子节点的值均不大于(或不小于)其左孩子和右孩子节点的值。

O(n) 个元素逐一插入到一个空堆中,时间复杂度是 O(nlogn)

heapify() 的过程,时间复杂度是 O(n)[参考]

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)

posted on   solvit  阅读(91)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示