python 堆

简介

堆(一般为小顶堆):

  1. 完全二叉树 (从上往下,从左往右)
  2. 父节点的值一定小于子节点的值

堆排序主要分为三部分:
3. 对一个杂乱无章的list创建堆结构,利用数组下标来初始二叉树。从倒数第二层开始向上从右往左构建最大堆
4. 对子树均为堆结构的根部分进行heapify(比较父节点的值和两个子节点的值,若父节点不是最小则交换最小值的子节点和父节点)
5. 对于一个最大堆其首字符必为整个堆中的最小值,将其弹出存储后,对剩余部分再重复2

堆插入:插入到最后一个叶子后面,在从下往上对每一个父节点进行heapify
堆删除:将根节点与最后一个叶子互换,砍掉这个叶子,然后从根开始heapify一次

代码

def Heapify(heap,HeapSize,root):
    #在堆中做结构调整使得父节点的值大于子节点,已经保证所有子树都是堆,只有根不符合堆的定义
    if root>=HeapSize:
        return
    c1=2*root + 1#根部左节点
    c2=2*root + 2#根部右节点
    mini=root#先设置根为最小节点
    if c1<HeapSize and heap[c1]<heap[mini]:
        mini=c1
    if c2<HeapSize and heap[c2]<heap[mini]:
        mini=c2
    if mini!=root:
        heap[mini],heap[root]=heap[root],heap[mini]#将最小值换到根
        Heapify(heap,HeapSize,mini)#mi这个节点向下继续建堆


def Heapinsert(heap, n, num = None):
#构造一个堆,如果有插入则从最后一位插入,再从倒数第二层开始网上构建堆
    if num != None:
        heap.append(num)
        n += 1
    last=n-1#从序列的最末端开始建堆
    parent=int(last/2)#找到倒数第二层最后一个父节点
    for i in range(parent,0,-1):
        #从倒数第二层开始递减向上构建堆
        Heapify(heap,n,i)

def HeapSort(heap):
#将根节点取出与最后一位做对调,对前面len-1个节点继续进行对调整过程。
    for i in range(len(heap)-1,0,-1):
        heap[0],heap[i]=heap[i],heap[0]
        Heapify(heap,i,0)
    return heap

def Heappop(heap):
#将根节点取出与最后一位做对调,对前面len-1个节点继续进行对调整过程。
    heap[0],heap[-1]=heap[-1],heap[0]
    tmp = heap.pop(-1)
    Heapify(heap,len(heap),0)
    return tmp

if __name__ == '__main__':
    nums=[1,20,3,4,1,9,5]
    print(nums)
    #构建堆
    Heapinsert(nums, len(nums))
    Heapinsert(nums, len(nums), 2)
    print(nums)
    while nums!=[]:
        print(Heappop(nums))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值