优先级队列--堆的应用(堆排序与TopK问题)

news2025/1/19 23:13:43

堆排序:比较方式为小于建大堆

        priority_queue(Iterator first, Iterator last)
			: _con(first, last) // 1、使用vector的区间构造函数来初始化_con
		{
			// 2、建堆:从完全二叉树的最后一个非叶子结点来进行向下调整
			for (int i = (size() - 2) / 2; i >= 0; i--)
			{
				AdjustDown(i);
			}
		}

		void priority_queue_sort()
		{
			size_t end = size() - 1;
			vector<int> res;
			while (!empty())
			{
				res.push_back(_con[0]);
				pop();
			}
			for (auto e : res)
				cout << e << " ";
			cout << endl;
		}

215. 数组中的第K个最大元素 TopK

给定整数数组 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

【解法一】排序返回

class Solution {
public:
    int findKthLargest(vector<int>& nums, int k) {
        sort(nums.begin(), nums.end());
        return nums[nums.size()-k];
        
        #include<functional>
        sort(nums.begin(), nums.end(), greater());
        return nums[k-1];
    }
};

【解法二】利用priority_queue的默认less来建大堆,popk-1次,返回堆顶即可

        priority_queue<int> q(nums.begin(), nums.end());
        for(int i = 1; i < k; i++)
        {
            q.pop();
        }
        return q.top();

【TopK引论】

    // 求该数组中前k个元素
    vector findKthLargest(vector<int>& nums, int k) {
        // 1、创建一个小根堆,最小的元素放堆顶
        priority_queue<int, vector<int>, Greater<int>> q;
        for(int i = 0; i < size(); i++)
        {
            // 2、前k个直接放入q中
            if(i < k)
                q.push(nums[i]);
            else
            {
                // 大于堆顶元素就将堆顶元素删除,并将nums[i]放入q中
                if(nums[i] > q.top())
                {
                    q.pop();
                    q.push(nums[i]);
                }
            }
        }
        return q;
    }

void AdjustDown(int array[], int size, int parent)
{
    int child = parent * 2 + 1;
    while (child < size)
    {
        if (child + 1 < size && array[child] > array[child + 1])
        {
            child = child + 1;
        }
        if (array[parent] > array[child])
        {
            Swap(&array[parent], &array[child]);
            parent = child;
            child = 2 * child + 1;
        }
        else
            return;
    }
}

void Heapsort(int array[], int size)
{
    // 堆排序
    // 首先进行建堆  降序建小队 升序建大堆
    for (int root = (size - 2) / 2; root >= 0; --root)
    {
        AdjustDown(array, size, root);
    }
 
    int end = size - 1;
    while (end)
    {
        // 利用堆删除的思想
        // 将堆尾元素与堆顶元素进行交换
        Swap(&array[end], &array[0]);
        // 再将堆顶进行向下调整即可   如此循环将每个元素进行排序
        AdjustDown(array, end, 0);
        end--;
    }
    Print(array, size);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/161512.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023真无线蓝牙耳机怎么选?值得入手的蓝牙耳机推荐

蓝牙耳机作为近几年备受人们欢迎的数码产品&#xff0c;很多人都想买到一款适合自己的蓝牙耳机。但&#xff0c;随着蓝牙耳机的快速发展&#xff0c;蓝牙耳机市场充斥着各种机型&#xff0c;它们有着不同的性能、价格、外观等。所以&#xff0c;不少人都有一个疑惑&#xff0c;…

玩转 MySQL Shell 沙盒实例

什么是沙盒实例&#xff1f; 沙盒实例仅适用于出于测试目的在本地计算机上部署和运行&#xff0c;可以与 InnoDB Cluster 、 InnoDB ClusterSet 和 InnoDB ReplicaSet 一起工作。 如何使用部署沙盒的 API 函数&#xff1f; 语法dba.deploySandboxInstance(port[, options])解…

Mybatis学习笔记(一)

什么是框架&#xff1f; 它是我们软件开发中的一套解决方案&#xff0c;不同的框架解决的是不同的问题使用框架的好处&#xff1a;框架封装了很多的细节&#xff0c;使开发者可以使用极简的方式实现功能&#xff0c;大大提高开发效率 三层架构 表现层&#xff1a;用于展示数…

慕尼黑工业大学开源含四季的数据集:用于自动驾驶的视觉长期定位

以下内容来自[从零开始机器人SLAM知识星球] 每日更新内容 点击领取学习资料 → 机器人SLAM学习资料大礼包 #论文# #开源数据集# 4Seasons: Benchmarking Visual SLAM and Long-Term Localization for Autonomous Driving in Challenging Conditions 地址&#xff1a;https:/…

LeetCode[295]数据流的中位数

难度:困难题目&#xff1a;中位数是有序整数列表中的中间值。如果列表的大小是偶数&#xff0c;则没有中间值&#xff0c;中位数是两个中间值的平均值。例如 arr [2,3,4] 的中位数是 3 。例如 arr [2,3] 的中位数是 (2 3) / 2 2.5 。描述&#xff1a;实现 MedianFinder 类:…

工信部及多地政府联合阿里健康在全国展开防疫保供专项行动

为了切实服务好百姓的购药需求&#xff0c;在工信部和各地政府的指导下&#xff0c;12月疫情政策调整以来&#xff0c;阿里健康已先后在全国20多个省市及地区配合药品物资精准投放工作&#xff0c;为各地居民重点供退热药、N95口罩等紧缺药品和物资&#xff0c;尽全力打好药品保…

Android系统定制开发过程快速查找定位分析代码的方法

推荐阅读 ​Android系统开发过程快速查找定位代码的方法 Android10以上系统定制Root权限(隐藏Root权限) 商务合作 2023年招聘 2023年逆向分析资料汇总 Android系统开发过程&#xff0c;经常需要进行文件查找、代码查找&#xff0c;常用find和grep查找命令 1.find命令 根据文…

短短六年时间冲到二奢品类第一,妃鱼如何做到的?

随着消费需求不断增长&#xff0c;二手奢侈品市场近五年来快速向规模化、平台化发展&#xff0c;妃鱼、红布林、胖虎等二奢电商品牌迅速崛起&#xff0c;成为风头劲胜的网红。国泰君安研究报告显示&#xff0c;中国闲置高端消费品零售市场规模已从2016年162亿元增长至2020年的5…

Vue js混淆加密 webpack-obfuscator

公司要求加密混淆js 之前 是用的glifyjs-webpack-plugin ,感觉不行。 然后使用了webpack-obfuscator 非常nice~&#xff0c;除了打包出来体积会有点大&#xff0c;浏览的网页会变慢&#xff0c;选择最低是就还好&#xff0c; 有多个条件属性可以选择&#xff0c; 可以选择高度混…

networkx学习(三) 随机网络

networkx学习(三) 随机网络 1.规则网络 2.随机网络的生成算法 第一种:G(N,L) import random import itertoolsdef GNL(N, L):G = nx.Graph()G.

硬盘数据如何恢复?电脑硬盘资料恢复,方法就是这么简单!

硬盘作为重要的存储设备&#xff0c;里面保存的数据是很重要的。日常生活和工作中&#xff0c;硬盘发生数据丢失也是很常见的事情&#xff0c;比如&#xff1a;误删重要文件并清空了回收站、文件打不开提示格式化、分区变成RAW格式、电脑重新分区等。各种数据丢失原因数不胜数。…

卷积神经网络-cnn和lstm

文章目录1. 卷积神经网络1.1 卷积神经网络的基础1.2 卷积神经网络和传统的网络的区别1.3 卷积的作用1.3.1 图像颜色通道1.3.2 卷积的次数1.4 卷积层涉及的参数1.4.1 滑动窗口的步长1.4.2 卷积核的大小1.4.3 边缘填充1.4.4 卷积核的个数1.4.5 卷积参数共享1.5 池化层1.6 整体网络…

如何在Microsoft Word设置导航窗格以重新排列页面

本文包括使用导航窗格和复制粘贴在Microsoft Word 2019、2016和Office 365中移动页面的说明。 Microsoft Word不会将文档视为单独页面的集合,而是将其视为一个长页面。因此,重新排列Word文档可能会很复杂。在Word中移动页面的一种更简单的方法是使用导航窗格。 注意:要在导…

Vue 3 桌面应用开发(文末附视频)

在正式开始之前&#xff0c;我想先直接“输出”一些背景信息&#xff0c;既能阐明我的观点&#xff0c;也希望可以坚定你学习本小册的决心。 首先&#xff0c;桌面应用开发在未来一定会大放异彩&#xff0c;桌面应用相对于移动应用来说优势非常明显&#xff08;交互区域更大、…

TCP/IP网络编程(3)——地址族与数据序列

文章目录第 3 章 地址族与数据序列3.1 分配给套接字的 IP 地址与端口号3.1.1 网络地址&#xff08;Internet Address&#xff09;3.1.2 网络地址分类与主机地址边界3.1.3 用于区分套接字的端口号3.2 地址信息的表示3.2.1 表示 IPV4 地址的结构体3.2.2 结构体 sockaddr_in 的成员…

王道操作系统笔记(二)———— 进程与线程

文章目录一、进程的概念和特征1.1 进程的概念1.2 进程的组成1.3 进程的特征1.4 进程的状态与转换1.5 进程控制1.6 进程的通信1.6.1 共享存储1.6.2 消息传递1.6.3 管道通信1.7 父进程与子进程二、线程概念和多线程模型2.1 线程的概念2.2 线程的属性2.3 线程的实现方式2.4 多线程…

C#【必备技能篇】DatagridView添加行时,设置行标题单元格的值为行数

文章目录1、DatagridView添加行的代码2、方法一&#xff1a;【每次添加行都重新刷新了全部的行数&#xff0c;不推荐】3、方法二&#xff1a;【只有一个DatagridView时&#xff0c;推荐此方法】4、方法三&#xff1a;【通用方法&#xff0c;多个DatagridView都有这个需求时&…

利用 Burp Suite 进行密码爆破

利用 Burp Suite 进行密码爆破1.Intruder 功能介绍2.攻击类型3.实战4.验证码爆破1.Intruder 功能介绍 使用 BP 工具的 Intruder 模块高度可配置&#xff0c;可以对目标网站进行密码爆破&#xff0c;一般被用于网站的安全渗透测试场景 BP 工具的 Intruder 模块包含几个功能标签…

解决2022.3.1版本中 IDEA中 XML文件屎黄色背景 的方法

问题&#xff1a;在idea打开mybatis的xml映射文件&#xff0c;出现大面积黄色背景提示 1&#xff1a;打开文件&#xff0c;点击设置 2&#xff1a;打开编辑器--> 检查--> SQL 3&#xff1a;受不了&#xff0c;我的是中文&#xff0c;我换成英文继续了 找到 No data sou…

CDH6.3.2 ORC文件格式 Spark引擎查询数组越界异常

组件版本: flink1.13.2 cdh6.3.2 hive2.1.1 问题描述: CDH6.3.2 ORC文件格式 Spark引擎查询数组越界异常 java.io.IOException: java.lang.ArrayIndexOutOfBoundsException: 7 ‘org.apache.orc.impl.ReaderImpl::ReaderImpl.java:385’, org.apache.hadoop.hive.ql.io.orc.Re…