数据结构之堆
介绍
优先级队列,又叫堆,是一个完全二叉树,其中每个节点的值总是大于(小于)或者等于子结点的值,所以就有大顶堆和小顶堆。一般树的实现都是用节点连接而成,也即是用指针,但是因为堆是一个完全二叉树,所以使用数组来标识更方便,从数组下标0开始,位置为i的节点其父节点位置一定是(i-1)/2,而它两个子结点的位置一定是2i+1,2i+2。
堆的实现
插入元素
在堆中插入元素,一般是**插入到数组的最后一个位置,**然后开始上浮调整,插入元素之前默认堆已经建好了,我们以大顶堆为例子。
// 插入元素
void inSert(vector<int>&arr,int data){
arr.push_back(data); // 将数据插入到数组末尾,然后开始上浮调整
}
// 元素上浮调整,此时默认其他元素已经组成了大顶堆
void swim(vector<int>&arr, int start){
int c=start;// 当前结点所处的位置,这里是数组最后一个元素的位置
int p = (c-1)/2; // 其父节点的位置
int tmp = arr[c]; // 当前节点的元素值,后面单向赋值使用
while(c>0) {
// 从最后一个位置依次和其父节点比较,直到根节点
if(tmp <= arr[p])break; // 如果插入的元素已经小于等于其父结点的值,说明有序了,已经满足堆的性质了
else{
// 否则和父节点开始交换元素
arr[c] = arr[p]; // 单向赋值即可,移动的是要插入的值,对要插入的值做出改变即可
c = p; // 索引改变,直接交换也可以
p = (p-1)/