python堆实现

本文详细介绍了使用递归方式实现Python3中heapify算法,用于将数组转化为小根堆。同时展示了如何利用该算法进行数组操作,如找到数组中最大的第k个数。还提供了Python库非递归实现作为比较,并通过示例代码演示了应用过程。
摘要由CSDN通过智能技术生成

heapify算法的递归Python3实现

Python3实现的heapify算法(用于将一个数组转化为小根堆)

def heapify(arr, n, i):
    smallest = i 
    l = 2 * i + 1     
    r = 2 * i + 2    

    if l < n and arr[i] > arr[l]:
        smallest = l

    if r < n and arr[smallest] > arr[r]:
        smallest = r

    if smallest != i:
        arr[i],arr[smallest] = arr[smallest],arr[i] 

        heapify(arr, n, smallest)

Note: 如果要用于将一个数组转化为大根堆,只需要修改

    if l < n and arr[i] < arr[l]:

    if r < n and arr[largest] < arr[r]:

将一个数组转化为小顶堆的实现就是:

for i in reversed(range(n // 2)):
    heapify(heap1, n, i)

[monica]

[https://www.cnblogs.com/charles101/p/14055491.html]

应用:取数组最大的第k个数

根据上面递归算法实现

import heapq


class Solution:
    def heapify(self, l):
        # 维护一个小顶堆
        lenl = len(l)

        def heapify1(curi):
            smallesti = curi
            lefti = 2 * curi + 1
            righti = 2 * curi + 2
            if lefti < lenl and l[lefti] < l[smallesti]:
                smallesti = lefti
            if righti < lenl and l[righti] < l[smallesti]:
                smallesti = righti
            if smallesti != curi:
                l[curi], l[smallesti] = l[smallesti], l[curi]
                heapify1(smallesti)

        for curi in reversed(range(lenl // 2)):
            heapify1(curi)

    def heappushpop(self, heap0, x):
        # 替换小顶堆顶部再维护
        heap0[0] = x
        self.heapify(heap0)

    def findKthLargest(self, nums: list[int], k: int) -> int:
        # 选出l最大的第k个
        heap0 = nums[:k]
        self.heapify(heap0)
        # print(heap0)
        for li in nums[k:]:
            if li > heap0[0]:
                self.heappushpop(heap0, li)
        return heap0[0]


nums = [3, 2, 3, 1, 2, 4, 5, 5, 6]
k = 4
print(Solution().findKthLargest(nums, k))  # 4

递归的会超时 

python库非递归heapify算法实现

import heapq

class Solution:
    def findKthLargest(self, nums: list[int], k: int) -> int:
        heap0 = nums[:k]
        heapq.heapify(heap0)
        for i in nums[k:]:
            if i > heap0[0]:
                heapq.heappushpop(heap0, i)
        return heap0[0]

l = [3, 9, 5, 1, 7, 13, 6, 8]
k = 5
print(Solution().findKthLargest(l, k))

from:https://blog.csdn.net/pipisorry/article/details/131057941

ref:
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值