阅读目录:

我们常见的二叉树的存储方式(表示方式):一般分为链式存储方式和顺序存储方式,下面我们基于列表的存储即为顺序存储方式

堆前序:

如果通过孩子节点找父节点则为(i-1)//2

堆:一种特殊的完全二叉树结构(满二叉树,但数据存储从左往右)

大根堆:一颗完全二叉树,满足任一节点都比其孩子节点大

小根堆:一颗完全二叉树,满足任一节点都比其孩子节点小

 

建堆及取出堆中元素

 示例代码:  时间复杂度:O(nlogn) 

def sift(li,low,high):
    """
    :param li: 列表
    :param low: 堆的根节点位子
    :param high: 堆的最后一个元素的位置
    :return:
    """
    i = low     #i最开始指向根节点
    j = 2*i +1   #j开始是左孩子
    tmp = li[i]  #把堆顶存起来
    while j<=high:  #只要j位置有数
        if j+1<=high and li[j+1]> li[j]: #如果右孩子有并且比较大
            j = j+1  #j指向右孩子
        if li[j]>tmp:
            li[i]=li[j]
            i = j  #往下看一层
            j = 2*i+1  #通过父亲找下下层的孩子
        else:    #tmp更大,把tmp放到i的位置上
            li[i] = tmp   #把tmp放到某一级领导的位置上
            break
    else:
        li[i] =tmp  #把tmp放到叶子节点上

def heap_sort(li):
    n = len(li)
    for i in range((n-2)//2,-1,-1):
        #i表示建堆的时候调整的部分的根的下标
        sift(li,i,n-1)
        # 堆建完成了
    for i in range(n-1,-1,-1):
        #i指向当前堆的最后一个元素
        li[0],li[i]=li[i],li[0]
        sift(li,0,i-1)  #i-1是新的high

li = [i for i in range(100)]
import random
random.shuffle(li)
heap_sort(li)
print(li)

执行结果:

python中内置模块

import heapq
li = [i for i in range(100)]
import random
random.shuffle(li)  
heapq.heapify(li)  #建堆
for i in range(len(li)):
    print(heapq.heappop(li),end=",")  #取出堆中元素

执行结果:

 

posted @ 2019-07-08 00:54  小萍瓶盖儿  阅读(104)  评论(0编辑  收藏  举报