优先队列 -- 大顶堆,小订堆

什么是堆(Heap)
优先队列(Priority Queue):特殊的”队列”,取出元素的顺序优先权的大小,而不是元素在队列的先后顺序;

1.使用完成二叉树;
2.数组表述;

堆中的路径(25 分)
将一系列给定数字插入一个初始为空的小顶堆H[]。随后对任意给定的下标i,打印从H[i]到根结点的路径。

输入格式:

每组测试第1行包含2个正整数N和M(≤1000),分别是插入元素的个数、以及需要打印的路径条数。下一行给出区间[-10000, 10000]内的N个要被插入一个初始为空的小顶堆的整数。最后一行给出M个下标。

输出格式:

对输入中给出的每个下标i,在一行中输出从H[i]到根结点的路径上的数据。数字间以1个空格分隔,行末不得有多余空格。

输入样例:
5 3
46 23 26 24 10
5 4 3
输出样例:

24 23 10
46 23 10
26 10

#include <stdio.h>
#include <stdlib.h>
#define MAXN 1000
#define MINH -10001
int H[MAXN],size;
void Create(){
    size = 0;
    H[0] = MINH;
}

void Insert(int X)
{
    int i;
    for(i=++size;H[i/2]>X;i/=2){
        H[i]=H[i/2];
    }
    H[i] = X;

}

int main()
{
    int M,N;
    scanf("%d%d",&M,&N);
    Create();
    int input;
    for(int i=1;i<=M;i++){
        scanf("%d",&input);
        Insert(input);
    }
    for(int i=0;i<N;i++)
    {
        scanf("%d",&input);
        printf("%d",H[input]);
        while(input>1)
        {
            input/=2;
            printf(" %d",H[input]);
        }
        printf("\n");
    }
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中的优先队列可以通过小顶堆大顶堆来实现。小顶堆是指优先级最小的元素在队列头部,大顶堆则相反,优先级最大的元素在队列头部。在Java中,可以通过PriorityQueue类来实现优先队列,其中默认是小顶堆实现。如果需要使用大顶堆实现,则可以通过传入一个比较器来实现。以下是两种实现方式的示例代码: 1. 小顶堆实现: ```java PriorityQueue<Integer> pq = new PriorityQueue<Integer>(); ``` 2. 大顶堆实现: ```java PriorityQueue<Integer> pq = new PriorityQueue<Integer>((x,y) -> y-x); ``` 关于应用方面,LeetCode题目中有一道关于优先队列的题目,即“最后一块石头的重量”。题目描述如下:有一石头,每块石头的重量都是正整数。每一回合,从中选出两块最重的石头,然后将它们一起粉碎。假设石头的重量分别为x和y,且x <= y。那么粉碎的可能结果如下: - 如果x == y,那么两块石头都会被完全粉碎; - 如果x != y,那么重量为x的石头将会完全粉碎,而重量为y的石头新重量为y-x。 最终,当只剩下一块石头时,返回这块石头的重量。可以使用优先队列来解决这个问题,具体实现方式为:将所有石头的重量加入到优先队列中,然后每次取出队列中最大的两个元素进行粉碎,将粉碎后的结果再加入到队列中,直到队列中只剩下一个元素为止。以下是示例代码: ```java public int lastStoneWeight(int[] stones) { PriorityQueue<Integer> pq = new PriorityQueue<Integer>((x,y) -> y-x); for(int stone : stones) { pq.offer(stone); } while(pq.size() > 1) { int x = pq.poll(); int y = pq.poll(); if(x != y) { pq.offer(y-x); } } return pq.isEmpty() ? 0 : pq.poll(); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值