用最大堆模拟最大优先级序列(Python实现)

####为了不失一般性,本文采用的是d叉堆实现。
代码如下:

# -*- coding:utf-8 -*-
# 此时假设的的 d = 4 
def ListMax(s):
    '''返回列表s中的最大值的下标'''
    max = 0
    for i in range(1,len(s)):
        if s[i] > s[max]:
            max = i
    return max
def BuildHeap4(li,d):
    '''建堆函数'''
    i = len(li) - 1
    while i>=0:
        MaxHeapify(li,i,d)
        i -= 1

def MaxHeapify(li, i, d):
    '''本函数的功能是在数组li中,使下标为i对应的值遵循最大堆的性质
       即它的子女必须小于等于它,以此类推,直到这个值满足条件或者它在
       叶子节点上'''
    s = []
    largest = i
    for j in range(1,d+1):
        if (d*i + j) > len(li)-1:
            break  
        s.append(li[d*i + j])
    if s == []:
        return
    else:
        max = ListMax(s)
        if li[d*i+max+1] > li[largest]:
            largest = d*i + max +1
        if largest != i:
            li[largest],li[i] = li[i],li[largest]
            MaxHeapify(li, largest, d)

def ExtractMax(li, d):
    '''去掉最大堆中的最大值,并返回'''
    max = li[0]
    li[0] = li[-1]
    li.pop()
    MaxHeapify(li, 0, d)
    return max

def Increase(li,i,key,d):
    '''更新某个节点的值,并使它满足最大堆的性质'''
    li[i] = key
    while i > 0 and li[i] > li[(i-1)/d]:
        li[i],li[(i-1)/d] = li[(i-1)/d],li[i]
        i = (i - 1)/d

def Insert(li, key,d):
    '''插入一个节点,并使它满足最大堆的性质'''
    li.append(key)
    Increase(li,len(li)-1,key,d)

if __name__ == '__main__':
    li = [7,2,9,2,1,1,2,3,4,3,8,2]
    BuildHeap4(li,4)
    print li
    print ExtractMax(li,4)
    print li
    Insert(li,10,4)
    print li 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值