优先队列实现,超级详细,附带cpp源码,看不懂你骂我!

本文介绍了优先队列的基本思想和API,包括插入数据、删除最大值以及获取队列大小。通过使用上浮(sink)和下沉(swim)操作,实现了基于数组的优先队列。在插入元素时,新节点插入队尾并上浮至正确位置;删除最大值时,返回头节点,然后将尾节点移至头部并下沉调整。提供的代码展示了这些操作的详细过程。
摘要由CSDN通过智能技术生成

优先队列的实现

Thinking-基本思想

优先队列是一个数据结构,数据进入队列,并且按照权值的大/小顺序出队

API-调用

  • void insert(int val); //用于插入数据
  • int deleMax(); //用于删除数据,此处是按照最大的数据返回!
  • int getSize(); //获取队列大小

Code-实现

在实现insert 和 deleMax之前, 我们先定义两个队列操作,swim 和 sink(上浮和下沉),他们是我们实现队列的关键。

  • sink 下沉操作,将队列比拟成一个树,pos的两个子节点的权值比pos位置的权值大的话, 就要和那个最大的子节点进行交换,直到pos的值到达合适的位置。
void MaxPQ::sink(int pos) {
    int k = pos;
    while(k*2 <= size) {
        int j = k*2;
        if (j<size && array[j] < array[j+1])j++;
        if (array[j] < array[k])break;
        exch(k, j);
        k = k*2;
    }
}
  • swim 上浮操作, 同样将队列比你成一个树, pos的父节点要是比pos的权值小的话,pos就要上升,直到pos的值到达合适的位置。
void MaxPQ::swim(int pos) {
   int k = pos;
   while(k > 1 && array[k] > array[k/2]) {
       exch(k, k/2);
       k = k/2;
   }
}

  • insert 操作,将要插入的节点放入数组尾端,让后上浮到合适的位置即可。
void MaxPQ::insert(int value) {
    array[++size] = value;
    swim(size);
}

  • deleMax操作,将返回头节点(因为上浮操作可知,头节点的值最大),然后把尾节点放入头部,再下沉。
int MaxPQ::deleMax() {
    int res = array[1];
    exch(1, size--);
    array[size+1] = 0;
    sink(1);
    return res;
}

github:

  • https://github.com/PinkDoc/database
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值