堆排序与TopK问题

一、堆排序

堆排序(升序):堆排序的思想就是先用数组模拟建大堆,然后把根结点与最后一个结点值交换,最后一个结点的值就是最大值,然后再把前(n-1)个元素重新建大堆,然后根结点与最后一个结点值交换,就找出了第二大的结点,....,重复操作就可以把数组排成有序。

总结:堆排序就是模拟建堆,然后找出最大的元素放最后一位,再找出次大的元素放倒数第二位,依次类推,最后变成有序。

为什么要建大堆?

如果建小堆的话只能找出最小的元素,后面的元素无法排序;

而建大堆可以找出最大的元素,再用最大的元素和最后一个元素换位,让最大的元素跑到最后面,再调用adjustdown(),调整建堆个数,让前n-1个数建堆,重复操作完成排序

1、 向下调整建堆

a、我们用数组看成是完全二叉树,物理结构是数组,逻辑结构是完全二叉树,大堆就是看成的完全二叉树的所有父亲结点大于自己的两个孩子 。

b、在左右子树都是大堆的情况下,根节点进行一次向下调整就可以建成大堆。

c、所以从数组最后一个元素的父亲结点开始,依次向上遍历,进行向下调整就可以满足b,

从而建成大堆。

d、(建大堆) 向下调整就是从parent结点开始与自己左右孩子中较大的那个比较大小,若parent更小,则交换值,然后parent = MinSon 继续向下比较,直到结束。

补充:在二叉树中的规律:parent =(child - 1)/ 2;  

        leftchild = parent * 2 + 1; rightchild = parent * 2 + 2 = leftchild + 1;

 

向下调整代码: 

void AdjustDown(HPDataType* a, int n, int parent)//大堆
{int MinSon = parent * 2 + 1;//假定左孩子为大while (MinSon < n){if (MinSon < n - 1 && a[MinSon] < a[MinSon + 1]){MinSon++;//若左孩子更小,则将MinSon变成右孩子}if (a[MinSon] > a[parent])//如果p结点比MS结点更小,则交换{swap(&a[MinSon], &a[parent]);parent = MinSon;MinSon = parent * 2 + 1;}else{break;}}

2、进行堆排序

将建好的大堆进行如下操作:

1、将首元素与尾元素互换,最大的值就已经到了末尾

2、将前n-1个值从根结点重新向下调整,因为此时左右树都是大堆,所有调整一次就能变成大堆,再重复第一步即可

堆排序代码(升序):

//升序建大堆,降序建小堆
void HeapSort(int* a, int n)
{int s = n;for (int i = (n - 2) / 2; i >= 0; i--)//向下调整建堆{AdjustDown(a, n, i);}while (n > 0)//倒着使数组有序{swap(&a[0], &a[n - 1]);n--;AdjustDown(a, n, 0);}for (int i = 0; i < s; ++i)//从0位置开始打印数组验证结果{printf("%d ", a[i]);}printf("\n");
}

降序建小堆就可以了,与上面类似( •̀ ω •́ )✧ 

 二、TopK问题

TopK问题:从 n 个数中,找出最大的前K个(n 远远大于 K)

思路:建一个K个数的小堆,让比根结点大的数进来,然后进行向下调整,重复次操作到数据结束,根节点就是K个数中最小的一个,最大的前K个数也找出来了。

TopK问题代码:

//TopK
void PrintTopK(int k)
{FILE* f = fopen("data.txt", "r");if (f == NULL){perror("fopen fail");exit(-1);}int* a = (int*)malloc(sizeof(int) * k);//a就是要建的堆if (a == NULL){perror("malloc fail");exit(-1);}for (int i = 0; i < k; ++i)//从文件读取K个数据{fscanf(f, "%d", &a[i]);}//然后建堆for (int i = (k - 2) / 2; i >= 0; i--){AdjustDown(a, k, i);}int x = 0;while (fscanf(f, "%d", &x) != EOF)//一直读取数据{if (x > a[0])//大于根节点的进来{a[0] = x;AdjustDown(a, k, 0);}}while (k > 0)//打印结果(升序){printf("%d ", a[0]);swap(&a[0], &a[k - 1]);k--;AdjustDown(a, k, 0);}printf("\n");free(a);
}

 建测试数据代码:

void CreateNDate()
{// 造数据int n = 10000;srand(time(0));const char* file = "data.txt";FILE* fin = fopen(file, "w");if (fin == NULL){perror("fopen error");return;}for (size_t i = 0; i < n; ++i)//10000个随机数{int x = rand() % 1000000;fprintf(fin, "%d\n", x);}for (int i = 9; i >= 0; --i)//造最大的K(10)个数,验证结果{int x = 1000000 + i;fprintf(fin, "%d\n", x);}fclose(fin);
}

感谢大家观看= ̄ω ̄=

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

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

相关文章

小红书笔记爬虫

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ &#x1f434;作者&#xff1a;秋无之地 &#x1f434;简介&#xff1a;CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作&#xff0c;主要擅长领域有&#xff1a;爬虫、后端、大数据…

LNMP架构搭建论坛

目录 一、LNMP简介&#xff1a; 二、LNMP搭建&#xff1a; 1.前提准备&#xff1a; 关闭防火墙和安全机制&#xff1a; 2.编译安装nginx&#xff1a; 3.编译安装mysql&#xff1a; 3.1 安装依赖环境&#xff1a; 3.2 创建mysql运行用户&#xff1a; 3.3 编译安装&#xff1a…

c语言练习题52:写一个函数判断当前机器是大端还是小端

代码&#xff1a; #include<stdio.h> int check_sys() {int a 1;return *(char*)&a;//小端retrun 1 大端return 0&#xff1b; } int main() {if (check_sys() 1) {printf("小端\n");}elseprintf("大端\n"); } 这里首先取a的地址&#xff0c…

原型链(一定要搞懂啊!!!>-<)

一、概念 1、prototype 习惯称作“显示原型”&#xff0c;只有构造函数才有的属性。 2、构造函数 能用new关键字创建的对象叫做构造函数 3、__proto__ 习惯称作“隐式原型”&#xff0c;每一个实例都有的属性&#xff0c;该属性指向他构造函数的“显示原型”。Function对象…

2.14 PE结构:地址之间的转换

在可执行文件PE文件结构中&#xff0c;通常我们需要用到地址转换相关知识&#xff0c;PE文件针对地址的规范有三种&#xff0c;其中就包括了VA&#xff0c;RVA&#xff0c;FOA三种&#xff0c;这三种该地址之间的灵活转换也是非常有用的&#xff0c;本节将介绍这些地址范围如何…

Mac端交互式原型设计 Axure RP 8 for Mac汉化

Axure RP 8是一款专业的交互原型设计工具&#xff0c;它被广泛应用于用户体验设计、界面设计和产品原型制作等领域。该软件提供了丰富的功能和工具&#xff0c;使用户能够创建出具有高度交互性和可视化效果的原型。 Axure RP 8的主要特点和功能包括&#xff1a; 1. 快速原型&a…

产教融合 | 力软联合重庆科技学院开展低代码应用开发培训

近日&#xff0c;力软与重庆科技学院联合推出了为期两周的低代码应用开发培训课程&#xff0c;来自重庆科技学院相关专业的近百名师生参加了此次培训。 融合研学与实践&#xff0c;方能成为当代数字英才。本次培训全程采用线下模式&#xff0c;以“力软低代码平台”为软件开发…

光谱通用款积分球

随着惯性约束聚变&#xff08;ICF&#xff09;物理理论的不断发展以及精密物理实验要求的不断提高&#xff0c;激光驱动器的光束路数急剧增多&#xff0c;光路长度和元器件数目成倍增长。模块化是新一代激光驱动器的发展趋势。对于高功率激光多参数测量系统&#xff0c;模块化设…

《DevOps实践指南》- 读书笔记(五)

DevOps实践指南 Part 4 第二步 &#xff1a;反馈的技术实践14. 建立能发现并解决问题的遥测系统14.1 建设集中式监控架构14.2 建立生产环境的应用程序日志遥测14.3 使用遥测指导问题的解决14.4 将建立生产遥测融入日常工作14.5 建立自助访问的遥测和信息辐射器14.6 发现和填补遥…

【视觉SLAM入门】7.4.后端优化 --- 基于位姿图和基于因子图

"议论平恕&#xff0c;无所向背” 1. 位姿图1.1 具体做法1.2 小结 2. 因子图2.1 具体做法2.1.1 贝叶斯网络2.1.2 因子图2.1.3 更具体的因子图2.1.4 增量的求解方法 引入&#xff1a; 上节BA将位姿和路标都作为优化的节点&#xff0c;H矩阵也告诉我们路标远大于位姿&#…

Python绘图系统16:动态更新tkinter组件

文章目录 前情提要源代码模式输入序列源码 Python绘图系统&#xff1a; &#x1f4c8;从0开始的3D绘图系统&#x1f4c9;一套3D坐标&#xff0c;多个函数&#x1f4ca;散点图、极坐标和子图自定义控件&#xff1a;极坐标&#x1f4c9;绘图风格&#x1f4c9;风格控件图表类型和…

rsync远程同步+inotify监控

目录 一、Rsync 简介 1、rsync是什么 2、备份的方式 3、rsync同步方式 4、常用rsync命令 5、配置源的两种表达方法 二、rsync实验 1、本地复制 ​编辑​编辑 2、异地复制 2.1 rsync服务器配置 2.2 rsync客户端配置 2.2.1 普通同步 2.2.2 免密同步 2.2.3 --delet…

EmguCV-C#版本Opencv图像识别和处理

目录 0、简介 1、图像处理 &#xff08;1&#xff09;颜色处理 &#xff08;2&#xff09;图像差 &#xff08;3&#xff09;图像拼接 &#xff08;4&#xff09;直方图 &#xff08;5&#xff09;颜色空间/通道提取 2、预处理 &#xff08;1&#xff09;均衡化 &…

idea2021.1.3版本双击启动,没反应

今天打开电脑&#xff0c;点开idea&#xff0c;界面悬在这里&#xff0c;几秒然后就是没了。然后就一直打不开idea了。 然后又是卸载重装&#xff0c;又是删除缓存文件。我把电脑关于idea的文件全都删除了 。重新安装后&#xff08;首次运行倒是可以打开&#xff0c;但是关掉id…

Python爬虫-IP隐藏技术与代理爬取

前言 在进行爬虫程序开发和运行时&#xff0c;常常会遇到目标网站的反爬虫机制&#xff0c;最常见的就是IP封禁&#xff0c;这时需要使用IP隐藏技术和代理爬取。 一、IP隐藏技术 IP隐藏技术&#xff0c;即伪装IP地址&#xff0c;使得爬虫请求的IP地址不被目标网站识别为爬虫。…

spring boot 使用AOP+自定义注解+反射实现操作日志记录修改前数据和修改后对比数据,并保存至日志表

一、添加aop starter依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId> </dependency>二&#xff1a;自定义字段翻译注解。&#xff08;修改功能时&#xff0c;需要显示如…

【mysql】—— 函数的基本介绍

前言&#xff1a; MySQL是一种常用的关系型数据库管理系统&#xff0c;它提供了许多内置的函数来进行数据操作和处理。本期&#xff0c;我将给大家介绍的就是关于 “函数” 的相关知识&#xff01;&#xff01;&#xff01; 目录 &#xff08;一&#xff09;日期函数 &#…

Linux基础命令(示例代码 + 解释)

查看目录下文件 ls [-a -l -h] [路径] -a&#xff08;全部&#xff09; -l&#xff08;细节&#xff09; -h&#xff08;大小&#xff09; ls ls / ls -a ls -l ls -h ls -alh ls -l -h -a ls -lah /切换目录 cd [路径] change di…

webrtc-m79-测试peerconnectionserver的webclient-p2p-demo

1 背景 webrtc的代码中有peerconnectionclient和peerconnectionserver的例子&#xff0c;但是没有对应的web端的例子&#xff0c;这里简单的写了一个测试例子&#xff0c;具体如下&#xff1a; 2 具体操作 2.1 操作流程 2.2 测试效果 使用webclient与peerconnectionclient的…

算法 数据结构 双向环形链表 手撸环形链表 环形链表实现容器 环形链表添加修改删除获取大小 环形链表实现自定义容器 手撸容器 双向环形哨兵链表 数据结构(六)

1. 环形链表&#xff1a; 2. 建议先不要看我写得自己先实现下&#xff0c;只将Node内部类复制自己命名得容器内&#xff0c; 实现方法&#xff1a; a. add方法&#xff08;添加到头部&#xff0c;尾部添加&#xff0c;指定位置添加&#xff09; b. get方法&#xff08;获取首部…