【C++STL】优先级队列priority_queue

创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
🔥c++系列专栏:C/C++零基础到精通 🔥

给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ

在这里插入图片描述

c语言内容💖:

专栏:c语言之路重点知识整合

【c语言】全部知识点总结


priority_queue

优先级队列(priority_queue)即堆(heap),内部可以看作是一颗完全二叉树

分为大根堆和小根堆,父节点均大于孩子节点是大根堆,父节点均小于孩子节点是小根堆

优先级队列能够每次将优先级最大的元素拿出,然后自动调整堆的结构

#include <queue>

//存储int型元素的大顶堆
std::priority_queue<int> pq;

//存储int型,队列底层vector,大顶堆
std::priority_queue<int,std::vector<int>,std::less<int>> pq;

//存储int型,队列底层vector,小顶堆
std::priority_queue<int,std::vector<int>,std::greater<int>> pq;

//插入元素num
pq.push(num);

//删除堆顶(优先级最高)的元素
pq.pop();

//获取元素个数
pq.size();

//获取堆顶元素
pq.top();

//优先级队列是否为空
pq.empty();

堆排序

使用数组模拟完全二叉树,左孩子节点为 2n+1,右孩子结点为 2n+2

堆排序的核心思想:

  1. 首先将数组构建成一个最大堆(最小堆)
  2. 然后将堆顶元素与数组的末尾元素交换
  3. 调整剩余元素为最大堆(最小堆)
  4. 重复上述步骤,直到整个数组排序完成
void Adjust(int arr[],int nLength,int nRootID)
{
    //调整堆顶
    int MAX; // 孩子中的大值
    for (MAX = 2 * nRootID + 1; MAX < nLength; MAX = (2 * nRootID + 1))
    {
		//两个孩子
		if(2 * nRootID + 2 < nLength)
		{
			//找到两个孩子里的大值
			if(arr[MAX] < arr[RIGHT])
			{
				MAX = 2 * nRootID + 2;
			}
		}
		//比较
		if(arr[nRootID] < arr[MAX])
		{
			//交换
			arr[nRootID] = arr[nRootID] ^arr[MAX];
            arr[MAX] = arr[nRootID] ^ arr[MAX];
            arr[nRootID] = arr[nRootID] ^ arr[MAX];
            //调整位置交换,MAX位置成为新的调整节点
            nRootID = MAX;
        }
        else
        {
            //直到父亲比孩子小
            break;
        }
    }

}
void HeapSort(int arr[], int len)
{
    if (arr == NULL || len <= 0) return;
    //建初始堆
	//依次调整各个父节点
    for (int i = len / 2 - 1; i >= 0;i--)
    {
        Adjust(arr, len, i);
    }
    //排序:将堆顶(最大)与最小交换
    for (int i = len - 1; i > 0;i--)
    {
        //交换
        swap(arr[i],arr[0]);
        //调整堆顶
        Adjust(arr, i, 0);
    }
}

堆排序的平均时间复杂度为O(nlogn)

image.png

数组中第 K 个最大元素

LeetCode.215. 数组中的第K个最大元素 - 力扣(LeetCode)

给定整数数组 nums 和整数 k,请返回数组中第 **k** 个最大的元素。
请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。

示例 1:

输入: [3,2,1,5,6,4], k = 2
输出: 5

示例 2:

输入: [3,2,3,1,2,4,5,5,6], k = 4
输出: 4

使用优先队列解决
构造最大堆,弹出前k-1个最大值,返回第k个最大值,即top()元素

class Solution {
public:
    int findKthLargest(vector<int>& nums, int k) {
        int size = nums.size();
        priority_queue<int,vector<int>,less<int>> pq;
        for(auto num:nums)
        {
            pq.push(num);
        }
        for(int i=0;i<k-1;i++)
        {
            pq.pop();
        }
        return pq.top();

    }
};

在这里插入图片描述

大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天喜Studio

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值