堆排序和Topk问题

堆排序

堆排序即利用堆的思想来进行排序,

总共分为两个步骤:

1. 建堆 升序:建大堆;   降序:建小堆

2 .利用堆删除思想来进行排序

利用堆删除思想来进行排序 建堆和堆删除中都用到了向下调整,因此掌握了向下调整,就可以完成堆排序。

建堆

我们建堆的也利用我们的向下调整来建立我们的堆,但是我们不从我们的根开始,因为如果从根开始的话可以用我们的向上调整建堆,但是时间会比我们的向下调整建堆。

我们向下调整的是用是从底下开始,使我们的分支是一个堆,然后在使我们的整体是一个堆。

向下调整来排序

这里的排序和我们的堆的数据的删除相似。我们将我们的根和数组的最后一个元素进行交换后,我们的count--,在将剩下的元素进行向下调整,那么数组的最后的数字就是我们的最大的数字或者最小的数字。我们进行调整完我们堆 的根就是我们第二小(大)的数字,如此在进行交换和调整这样我们的数组就会变成有序的(升序或者降序)(我们这里写的是降序)。

总代码:

//对数组进行堆排序
void HeapSort(int* a, int n)
{//建堆int i = 0;int count = n;for (i = (n-1-1)/2; i>=0; i--){AdjustDown(a, i, n);}for (i = 0; i < n; i++){Swag(&a[0], &a[n - i - 1]);count--;AdjustDown(a, 0,count );}
}

Topk问题

TOP-K问题:即求数据结合中前K个最大的元素或者最小的元素,一般情况下数据量都比较大。 比如:专业前10名、世界500强、富豪榜、游戏中前100的活跃玩家等。

对于Top-K问题,能想到的最简单直接的方式就是排序,但是:如果数据量非常大,排序就不太可取了(可能 数据都不能一下子全部加载到内存中)。

最佳的方式就是用堆来解决,基本思路如下:

1. 用数据集合中前K个元素来建堆 前k个最大的元素,则建小堆 前k个最小的元素,则建大堆

2. 用剩余的N-K个元素依次与堆顶元素来比较,不满足则替换堆顶元素。

当我们所有的数据比完后,这个堆中就只剩下我们的最大的或者最小的前k个数。这样需要的空间不会很大。

代码:

//创建数据,放在文件里面,随机数。
void CreakData()
{FILE* fin = fopen("data.txt", "w");if (fin == NULL){perror("FILE* fin eorror");return;}srand((unsigned int)time(0));int i = 0;for (i = 0; i < 100000; i++){int count = rand() % 100000;fprintf(fin, "%d ", count);}fclose(fin);}
//解决topk问题
void  PrintTopK(int k)
{//topK问题int* topk = (int*)malloc(sizeof(int) * k);if (topk == NULL){perror("malloc");}int i = 0;int count = 0;//创建数据/*CreakData();*///打开文件FILE* fin = fopen("data.txt", "r");if (fin == NULL){perror("fopen!");return;}//读取前面k个数字for (i = 0; i < k; i++){fscanf(fin, "%d", &topk[i]);}//建堆for (i = (k - 1 - 1) / 2; i >= 0; i--){AdjustDown(topk, i, k);}//开始往后面读取数字,如果比我们的堆顶的数字大就和我们堆顶的数字交换//fsanf的返回值是他读取到字符个数.while (fscanf(fin, "%d", &count) == 1){if (count > topk[0]){//交换并调整,使它形成新的堆topk[0] = count;AdjustDown(topk, 0, k);}}for (i = 0; i < k; i++){printf("%d ", topk[i]);}fclose(fin);free(topk);
}

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

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

相关文章

外卖系统关于redis使用解决高并发情况

1、如何配置redis 在java中操作redis 操作步骤&#xff1a; 1、导入Spring Data Redis的maven坐标 2、配置Redis数据源 3、编写配置类&#xff0c;创建RedisTemplate对象 4、通过RedisTemplate对象操作Redis 2、Redis结合Lua脚本 减少网络开销&#xff1a;使用Lua脚本&#xf…

FolkMQ v1.5.1 发布(“新式”国产消息中间件)

FolkMQ 是个“新式”的消息中间件。强调&#xff1a;“小而巧”、“简而强”。 功能简表 角色功能生产者&#xff08;客户端&#xff09;发布普通消息、Qos0消息、定时消息、顺序消息、可过期消息、事务消息、广播消息消费者&#xff08;客户端&#xff09;订阅、取消订阅。消…

前端面试题日常练-day27 【面试题】

题目 希望这些选择题能够帮助您进行前端面试的准备&#xff0c;答案在文末。 1. 在Vue中&#xff0c;以下哪个选项可以用于监听数据的变化并执行相应的操作&#xff1f; a) computed b) methods c) data d) watch 2. 在Vue中&#xff0c;以下哪种方式可以实现组件之间的通信…

中医理疗元宇宙 科技赋能中医药产业走向国际市场

基于380亿参数量&#xff0c;对中医药海量文本进行数据训练&#xff0c;实现方剂优化、机制阐释和新适应症的精准发现……日前在天津召开的数智赋能大健康产业新质生产力暨第四届中医药国际发展大会上&#xff0c;由天士力医药集团与华为云共同开发的“数智本草”中医药大模型正…

37. 解数独 - 力扣(LeetCode)

基础知识要求&#xff1a; Java&#xff1a; 方法、for循环、if else语句、数组 Python&#xff1a; 方法、for循环、if else语句、列表 题目&#xff1a; 编写一个程序&#xff0c;通过填充空格来解决数独问题。 数独的解法需 遵循如下规则&#xff1a; 数字 1-9 在每一行…

Windows搭建Nginx代理本地盘的文件(共享路径或本地路径)

文章目录 Windows搭建Nginx代理本地盘的文件 - 前言需求背景挂载网络共享路径检查连接状态下载Nginx编辑 Nginx 配置文件启动 Nginx检测Nginx是否成功启动使用方法远程共享路径示例本地文件示例 测试 Windows搭建Nginx代理本地盘的文件 - 前言 在开发过程中&#xff0c;确保文…

ChatGPT Mac客户端 下载安装教程(免费 不限次数使用 还支持语音聊天)

ChatGPT Mac客户端 下载安装教程&#xff08;免费 不限次数使用 还支持语音聊天&#xff09; 原文链接&#xff1a;https://blog.csdn.net/weixin_48311847/article/details/139248625 免费 不限次数使用 还支持语音聊天

mysql 排序、查询执行流程、幻读

文章目录 MySQL的 ORDER BY 执行流程示例表和查询语句执行流程全字段排序Rowid 排序全字段排序 VS rowid排序联合索引优化覆盖索引优化 小结思考题问题执行过程中是否需要排序&#xff1f;如何在数据库端实现不排序&#xff1f;实现分页需求 使用ORDER BY RAND()内存临时表与磁…

ANDROID OLLVM 混淆配置

安装环境 MacOSGITCMAKENDK - 21.1.6352462 步骤 1. 编译项目 此项目版本较低 https://github.com/obfuscator-llvm/obfuscator &#xff0c;我们使用 https://github.com/heroims/obfuscator 进行编译 git clone https://github.com/heroims/obfuscator.gitcd obfuscator…

曼城四连冠,剑南春与万千球迷共同见证“荣耀时刻”

执笔 | 洪大大 编辑 | 扬 灵 5月19日&#xff0c;英超2023-2024赛季第38轮比赛全面开打&#xff0c;凭借队员的出色发挥&#xff0c;曼城最终以3-1战胜西汉姆联&#xff0c;成功捧起了英超联赛的奖杯&#xff0c;成为英格兰足球顶级联赛100多年历史上第一支成就四连冠的豪门…

事务报错没有显示回滚导致DDL阻塞引发的问题

在业务开发过程中&#xff0c;显示的开启事务并且在事务处理过程中对不同的情况进行显示的COMMIT或ROLLBACK&#xff0c;这是一个完整数据库事务处理的闭环过程。 这种在应用开发逻辑层面去handle的事务执行的结果&#xff0c;既确保了事务操作的数据完整性&#xff0c;又遵循了…

简单句语法

简单句是指包含一个主语和一个谓语的句子&#xff0c;它表达一个完整的思想。简单句是构成更复杂句子的基础。 简单句的两种基本结构 简单句可以分为两种基本结构&#xff1a; 主谓结构: 描述主语所做的动作或行为&#xff0c;也就是 “做什么”。 主系结构: 描述主语的状态…

Python2和Python3对utf8的实现方式有什么区别?

# -*- coding: utf8 -*- 是一个特殊的文件头部注释&#xff0c;通常出现在Python 2的源代码文件的开头。这个注释告诉Python解释器&#xff0c;该源文件使用的是UTF-8编码。这对于包含非ASCII字符&#xff08;例如中文字符、特殊符号等&#xff09;的Python源代码文件来说非常重…

探索未来设计新境界,PSAI插件 艺术创作神器来袭!

想象一下&#xff0c;如果有一个工具&#xff0c;能够让你的设计工作变得既简单又高效&#xff0c;那会是怎样的体验&#xff1f;现在&#xff0c;梦想成真了&#xff01; 这是一款革命性的PSAI设计插件&#xff0c;专为创意人士打造。它将彻底改变你的设计流程&#xff0c;让你…

【OpenCV】像素信息统计

介绍了计算像素均值、方差的API&#xff0c;以及统计像素信息的方法。相关API&#xff1a; minMaxLoc()mean()meanStdDev() 代码&#xff1a; #include "iostream" #include "opencv2/opencv.hpp"using namespace std; using namespace cv;int main(int…

谈谈如何建立可落地的数字化转型战略

数字化转型战略是指将数字技术集成到企业或组织的所有领域&#xff0c;从根本上改变其运营方式以及为客户提供价值的方式。它涉及采用新技术并重新思考现有业务流程&#xff0c;以提高效率、生产力和客户满意度。 成功的数字化转型战略需要采用涉及人员、流程和技术的整体方法。…

【全开源】JAVA同城搬家系统源码小程序APP源码

JAVA同城搬家系统源码 特色功能&#xff1a; 强大的数据处理能力&#xff1a;JAVA提供了丰富的数据结构和算法&#xff0c;以及强大的并发处理能力&#xff0c;使得系统能够快速地处理大量的货物信息、司机信息、订单信息等&#xff0c;满足大规模物流的需求。智能路径规划&a…

香橙派 AIPro开发板上手测评

前言 最近拿到了一个新玩具&#xff1a;香橙派 AIPro。一个只比银行卡大一点点的开发板能带给我们多少惊喜呢&#xff1f;接下来就跟我一起来体验下这块开发板的魅力。 一、硬件配置 CPU&#xff1a;配备了4核64位ARM处理器&#xff0c;其中默认预留1个给AI处理器使用 NPU&am…

SpringBoot和Apache Doris实现实时广告推荐系统

本专题旨在向读者深度解读Apache Doris技术,探讨其与SpringBoot框架结合在各类实际应用场景中的角色与作用。本专题包括十篇文章,每篇文章都概述了一个特定应用领域,如大数据分析、实时报告系统、电商数据分析等,并通过对需求的解析、解决方案的设计、实际应用示例的展示以…

【Python实战】你还在冲会员看电影电视剧吗?Python带你实现各大资源免费看!

前言 halo&#xff0c;包子们下午好 今天给大家实现一个视频播放器&#xff0c;可以看任何电影&#xff0c;电视剧&#xff0c;不要再为以后看电视看电影而烦恼&#xff0c;今天是福利文章&#xff0c;相信我绝对有用&#xff01; 开发工具 Python版本&#xff1a;3.7.8 相…