堆排序与TopK问题

news2024/10/6 6:46:13

一、堆排序

堆排序(升序):堆排序的思想就是先用数组模拟建大堆,然后把根结点与最后一个结点值交换,最后一个结点的值就是最大值,然后再把前(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.coloradmin.cn/o/1004418.html

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

相关文章

javac不是内部或外部命令也不是可运行的程序如何解决?

小伙伴们你们有没有遇到过javac不是内部或外部命令,也不是可运行的程序这样的问题呢&#xff1f;大家遇到这样的问题不要慌&#xff0c;只要学会以下的操作你就可以轻松的解决了&#xff0c;具体的步骤操作就在下方&#xff0c;小伙伴们可以认真的看一看吧&#xff01; 1.首先…

cad文件如何转换成pdf?=

cad文件如何转换成pdf&#xff1f;在现代机械制造和建筑装饰领域中&#xff0c;CAD&#xff08;计算机辅助设计&#xff09;软件的应用非常普遍。然而&#xff0c;在与他人共享设计文件时&#xff0c;会发现cad文件的使用并不方便&#xff0c;首先它需要专用的软件才能将其打开…

webpack实战:某网站RSA登录加密逆向分析

文章目录 1. 写在前面2. 抓包分析3. 定位分析4. 构建webpack 1. 写在前面 回过头看&#xff0c;已慢慢将JS爬虫逆向类型的文章从0建设到了1&#xff0c;文章所有案例真实且内容有效&#xff0c;加密类型丰富。收获了很多粉丝的关注与支持&#xff0c;非常感谢大家&#xff01; …

奥康的高尔夫鞋,圈不住投资者的心

文 | 螳螂观察 作者 | 青月 鞋服行业终于熬过了“寒冬”&#xff0c;2023年行业景气度开始逐步回暖。 东方财富Choice数据显示&#xff0c;截至8月17日&#xff0c;已有28家鞋帽服装类上市公司发布了2023年中期业绩预告或快报&#xff0c;其中&#xff0c;9家预增&#xff0…

TCP的滑动窗口与拥塞控制

客户端每发送的一个包&#xff0c;服务器端都应该有个回复&#xff0c;如果服务器端超过一定的时间没有回复&#xff0c;客户端就会重新发送这个包&#xff0c;直到有回复。 为了保证顺序性&#xff0c;每一个包都有一个 ID。在建立连接的时候&#xff0c;会商定起始的 ID 是什…

Python 数据库——链表

基本概念 链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。链表在逻辑上是连续的&#xff0c;但是在物理空间上可能是不连续的&#xff0c;因为链表的内存都是临时申请的&#xff0c;不一定会申请到连续的…

作物模型与遥感反演值同化建模的程序化实现

目录 专题一 遥感基础理论知识 专题二 作物长势监测与产量估算国内外研究进展 专题三 Fortran编程语言 专题四 作物参数遥感反演基本原理 专题五 PROSAIL模型 专题六 参数敏感性分析 专题七 遥感反演过程中的代价函数求解问题 专题八 基于查找表方法PROSAIL模型的作物参…

antd react 文件上传只允许上传一个文件且上传后隐藏上传按钮

antd react 文件上传只允许上传一个文件且上传后隐藏上传按钮 效果图代码解析 效果图 代码解析 import { Form, Upload, message } from antd; import { PlusOutlined } from ant-design/icons; import { useState, useEffect } from react; import { BASE_URL } from /utils/…

IOMesh 为 KubeVirt 提供高效稳定的持久化存储支持(附用户实践)

7 月 11 日&#xff0c;KubeVirt 社区正式宣布发布 Kubernetes 原生虚拟机管理插件 KubeVirt v1.0。这一版本发布不仅标志着 KubeVirt 已进化为生产就绪的虚拟机管理解决方案&#xff0c;也为正在使用虚拟化环境的用户提供了更多元的云化转型路线&#xff1a;搭配 Kubernetes 持…

vue3的params传参失效的解决方案state

vue3使用vue-router4.0&#xff0c;但是使用router.push的params传参&#xff0c;一直拿不到参数 查阅资料如下&#xff1a; —————————————————————————————————————————— state方案如下&#xff1a; 要传参的组件 import { u…

【C++模拟实现】手撕红黑树(含图解)

【C模拟实现】手撕红黑树&#xff08;含图解&#xff09; 目录 【C模拟实现】手撕红黑树&#xff08;含图解&#xff09;红黑树的介绍&#xff08;百度百科&#xff09;简介特征&#xff08;十分重要&#xff0c;红黑树的基础&#xff09; 红黑树的实现代码&#xff08;insert部…

运营商大数据合作方合作流程和具体服务流程是什么?

运营商大数据合作方合作的流程分为好几个阶段。首先是要进行合作咨询&#xff0c;咨询完成了以后&#xff0c;再直接对相关的数据进行相应的评估。接着再把资源整合起来&#xff0c;然后再对数据进行清洗&#xff0c;接着直接将产品进行包装&#xff0c;然后给数据定价&#xf…

Linux时区配置

Linux时区配置 timedatectl设置时区和时间启用自动同步NTP时间设置UTC或RTC时间查看UTC时间 查看所有可用时区查看当前时区设置系统时区启用夏令时timedatectl修改当前日期时间 通用设置时区方法使用tzselect设置时区 timedatectl设置时区和时间 timedatectl是一个系统工具&am…

解决微信小程序报错:“SyntaxError:Unexpected end of JSON input”

1. 报错原因&#xff1a; 如果对象的参数或数组的元素中遇到地址&#xff0c;地址中包括?、&这些特殊符号时&#xff0c;对象/数组先要通过JSON.stringify转化为字符串再通过encodeURIComponent编码&#xff1b;接收时&#xff0c;先通过decodeURIComponent解码再通过JSON…

成集云 | 聚水潭对接金蝶云星空接口 | 解决方案

源系统成集云目标系统 方案介绍 聚水潭是一款以SaaS ERP为核心&#xff0c;集多种商家服务为一体的SaaS协同平台&#xff0c;为全国35万多家电商企业提供全面的信息化解决方案。聚水潭已在全国设立了超过60个线下服务网点&#xff0c;服务范围覆盖超过300个城市&#xff0c;为…

05目标检测-区域推荐(Anchor机制详解)

目录 一、问题的引入 二、解决方案-设定的anchor boxes 1.高宽比&#xff08;aspect ratio&#xff09;的确定 2.尺度(scale)的确定 3.anchor boxes数量的确定 三、Anchor 的在目标检测中是怎么用的 1、anchor boxes对真值bounding box编码的步骤 2、为什么要回归偏移量…

Linux安装jdk11

官网下载链接 https://www.oracle.com/java/technologies/downloads/#java11 下载解压并更改环境变量 export JAVA_HOME/home/jenkins/jdk-11.0.20 PATH"$HOME/.local/bin:$HOME/bin:$JAVA_HOME/bin:$PATH"

5G网络优化工程师如何挑选最合适的电脑?

最近很多要来学习5G网络优化的小伙伴都在问小编什么样的电脑会比较合适&#xff0c;开学季嘛电子产品都比较的优惠&#xff0c;想要下手一台性价比较高的笔记本 &#xff0c;希望小编能够给点建议&#xff0c;于是小编马不停蹄的联系了老师以及就业的学员详细的了解之后&#x…

Error: That port is already in use.

刚开始看后端的内容 经常遇到的问题就是Error: That port is already in use. 解决方法 有两个方法可以解决(假设8000端口被占用)&#xff1a; 1. 使用python manage.py runserver 8001 开一个新的端口。 2. kill掉原来的端口(在root条件下)。 在终端输入lsof -i:8000&am…

3dmax 基础操作

基础快捷键 1.放大视图 Altw 2.缩放 滑动滚轮 3.移动物体 按w 移动画布 ctrlp/鼠标中键 4.旋转视图 alt鼠标中键 5.复制 shift移动 6.视图切换 P透视 T顶视图 F前视图 L左视图 7.线框模型显示 f4 8. 只显示线框不显示模型 f3…