堆
阅读目录:
我们常见的二叉树的存储方式(表示方式):一般分为链式存储方式和顺序存储方式,下面我们基于列表的存储即为顺序存储方式
堆前序:
如果通过孩子节点找父节点则为(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=",") #取出堆中元素
执行结果: