大根堆的插入、删除、修改优先级实现

       大根堆其实就是一个一维数组, 不过数组中数据的排列是基于完全二叉树模型的。根节点的数据大于等于左孩子和右孩子节点的数据,然后每个子树都和前面一样。它的主要应用是在优先级队列中, 因为大根堆或小根堆总是能很方便的找出最大的值或最小值,虽然有序的线性表一样可以实现该功能,但是有序线性表的致命缺陷在与入队时为了保持线性表仍是有序的,可能需要移动大量元素, 而大根堆和小根堆则相对有着更好的性能。

       用数组来存储大根堆时,可以从第1个元素开始存储,这样的好处是可以很方便的求出当前元素的父亲结点和孩子结点。 如当前元素下标是i,则他的左孩子为2*i, 右孩子为2I + 1,父亲结点为i/2。

//heap.h

#ifndef HEAP_H_
#define HEAP_H_
#include <stdio.h>
#define MAX_ELEMENTS 200


typedef struct Element{
    int key;
    /*other field*/
}Element;


typedef struct Heap{
    Element heap[MAX_ELEMENTS];
    int n;
}Heap;


void initHeap(Heap *php);
void push(Heap * php, Element e);//插入大根堆
Element pop(Heap *php);//删除根结点
void showHeap(Heap * php);
void setvalue(Heap * php, int index, int value);// 修改第index个元素的key为value

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值