数据结构-堆
堆是优先级队列的另一种实现结构,堆是一种数(插入和删除时间复杂度O(logN))
使用场景:速度非常重要,且有很多插入操作时,可以选择堆实现优先级队列
堆特点
- 完全二叉树
- 常常用一个数组实现
- 堆中的每一个节点都满足堆的条件,每一个关键字都大于或等于这个节点的子节点的关键字
用数组表示一颗树的要点,若数组中节点的索引为x则
- 父节点=(x-1)/2
- 左子节点=2x+1
- 右子节点=2x+2
前段时间自学了python,这次用python实现堆排序
Node.py123class Node: def __init__(self,key): self._key=key
堆结构Heap.py1234567891011121314import Nodeclass Heap: #初始化 def __init__(self,max): self._currentSize=0 self._maxSize=max self._heapArray=[0]*max #插入新节点方法省略 def insert(self,key): #删除节点方法省略 def remove(self): #改变节点值方法省略 def change(self,index,newValue);
1.插入方法
步骤:
- 最后一个位置添加新节点
- 向上跟父节点筛选比较大小,直到它在一个大于它的节点之下,小于它的节点之上
|
|
|
|
2.移除方法
步骤:
- 移走根
- 把最后一个节点移动到根的位置
- 一直向下筛选这个节点,直到他在一个大于它的节点之下,小于它的节点之上
向下筛选的算法要检查哪一个子节点更大,然后目标节点和较大的子节点交换,否则违背了堆的条件(父节点大于子节点)
|
|
|
|
3.改变节点值
改变一个已存在节点的优先级,
- 获取旧值
- 索引位置被替换为新值
- 比较旧值和新值如果新值大于旧值就向上筛选,否则向下筛选
|
|
注:该内容为Java数据结构和算法读后学习感悟