优先队列和堆的实现

···堆的逻辑结构是一种二叉树,而物理结构是一维数组,它拥有以下特点:

1*、儿子的值一定不小于父亲的值。

2、树的节点是按照从上到下,从左到右的顺序紧凑排列的。

在插入操作时,先把数值放到堆的末尾,然后检查他的位置是否合适(他的值是否大于父节点的值),不合适则往上交换。

在输出操作时,先出0位置的元素,然后把末尾的元素放到0位置,然后检查0位置是否合适,不合适则向下交换,注意:是与子节点中值更小的那个交换。

这是我自己写的push()和pop()的实现:

#include <iostream>
#include <cstdio>
#define MAX_N 100005//

using namespace std;

int sz=0;//
int heap[MAX_N];

void push(int x){
    int i=sz++;
    heap[i]=x;
    int p=(i-1)/2;
    while(heap[p]>heap[i]){
        heap[p]^=heap[i];
        heap[i]^=heap[p];
        heap[p]^=heap[i];
        i=p;
        p=(i-1)/2;
    }
}

int pop(){
    int ans=heap[0];
    heap[0]=heap[--sz];
    int i=0;
    int l=i*2+1,r=i*2+2;
    int minn=heap[l]<heap[r]?l:r ;
    while(heap[i]>heap[minn]&&r<sz){
        heap[i]^=heap[minn];
        heap[minn]^=heap[i];
        heap[i]^=heap[minn];
        i=minn;
        l=i*2+1;r=i*2+2;
        minn=heap[l]<heap[r]?l:r ;
    }
    return ans;

}

int main(){
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        int t;
        scanf("%d",&t);
        push(t);
    }
    while(sz){
        printf("%d ",pop());
    }

    return 0;
}

 

···堆实际上正好解决“优先队列”的问题,优先队列有以下两个特点:

1、插入一个数值。

2、每次取出最小的数值。

···一般情况下优先队列并不用自己实现,在c++中stl里的priority_queue就是,不过这个每次取出的是最大值,下面是一个简单例子:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <queue>
 4 using namespace std;
 5 
 6 int main()
 7 {
 8     priority_queue<int> pque;
 9     pque.push(3);
10     pque.push(5);
11     pque.push(1);
12 
13     while(!pque.empty()){
14         printf("%d\n",pque.top());
15         pque.pop();
16     }
17     return 0;
18 }

另外如果想要从小到大的输出,有个简单的小技巧,对于整数可以这样处理:

#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;

int main()
{
    priority_queue<int> pque;
    pque.push(100-3);
    pque.push(100-5);
    pque.push(100-1);

    while(!pque.empty()){
        printf("%d\n",100-pque.top());
        pque.pop();
    }
    return 0;
}

 

全部评论

相关推荐

老粉都知道小猪猪我很久没更新了,因为秋招非常非常不顺利,emo了三个月了,接下来说一下我的情况吧本人是双非本&nbsp;专业是完全不着计算机边的非科班,比较有优势的是有两段大厂实习,美团和字节。秋招面了50+场泡池子泡死的:滴滴&nbsp;快手&nbsp;去哪儿&nbsp;小鹏汽车&nbsp;不知名的一两个小厂其中字节13场&nbsp;两次3面挂&nbsp;两次2面挂&nbsp;一次一面挂其中有2场面试题没写出来,其他的都是全a,但该挂还是挂,第三次三面才面进去字节,秋招加暑期总共面了22次字节,在字节的面评可以出成书了快手面了8场,2次实习的,通过了但没去,一次2面挂&nbsp;最后一次到录用评估&nbsp;至今无消息滴滴三面完&nbsp;没几天挂了&nbsp;所有技术面找不出2个问题是我回答不上来的,三面还来说我去过字节,应该不会考虑滴滴吧,直接给我干傻了去哪儿一天速通&nbsp;至今无消息小鹏汽车hr&nbsp;至今无消息美团2面挂&nbsp;然后不捞我了,三个志愿全部结束,估计被卡学历了虾皮二面挂&nbsp;这个是我菜,面试官太牛逼了拼多多二面挂&nbsp;3道题也全写了&nbsp;也没问题是回答不出来的&nbsp;泡一周后挂腾讯面了5次&nbsp;一次2面挂&nbsp;三次一面挂,我宣布腾讯是世界上最难进的互联网公司然后还有一些零零散散的中小厂,但是数量比较少,约面大多数都是大厂。整体的战况非常惨烈,面试机会少,就算面过了也需要和各路神仙横向对比,很多次我都是那个被比下去的人,不过这也正常,毕竟谁会放着一个985的硕士不招,反而去招一个双非读化学的小子感觉现在互联网对学历的要求越来越高了,不仅仅要985还要硕士了,双非几乎没啥生存空间了,我感觉未来几年双非想要进大厂开发的难度应该直线上升了,唯一的打法还是从大二刷实习,然后苟个转正,不然要是去秋招大概率是炮灰。而且就我面字节这么多次,已经开始问很多ai的东西了,你一破本科生要是没实习没科研懂什么ai啊,纯纯白给了
不知名牛友_:爸爸
秋招你被哪家公司挂了?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务