堆排序及top-k问题

news2025/1/31 11:21:11

堆排序及top-k问题

  • 堆排序
    • 建堆
      • 向上调整建堆
      • 向下建堆
    • 堆排序
  • top-k问题,建堆的应用

堆排序

堆排序,听名字就是要对堆进行排序,但当我们是无序数据时,首先我们就需要建立一个堆
在这里插入图片描述

建堆

这里让我们来回忆一下前面的堆,改变堆的数据顺序我们有向上调整和向下调整。

向上调整建堆

在这里插入图片描述
这是向上调整堆的思路。

当我们对一个数据进行向下调整时,首先要保证上面都成堆。
在这里插入图片描述

那我们从最上面一个一个进行向上调整
不就可以保证上面都是堆了嘛。

在这里插入图片描述
1:arr[0]进行建堆
2:对arr[0],arr[1]进行建堆
3:对arr[0],arr[2],arr[3]进行建堆
………………………………
这样就能保证对堆的第n个数据进行调整时,n以上的所有数据都成堆

void Swap(int* arr, int x, int y)
{
	int tmp = arr[x];
	arr[x] = arr[y];
	arr[y] = tmp;
}
void adjustup(int* a, int child)
{
	int parent = (child - 1) / 2;
	while (child > 0)
	{
		if (a[child] > a[parent])
		{
			Swap(a, child, parent);
			child = parent;
			parent = (parent - 1) / 2;
		}
		else
			break;
	}
}
void creatheap(int* arr,int size)
{
	for (int i = 0; i < size; i++)
	{
		adjustup(arr, i);
	}
}
int main()
{
	int arr[20] = { 54,76,23,58,167,367,235,651,764,126,538,12,79,23,46,13,67,38,30,15 };
	creatheap(arr,20);
	for (int i = 0; i < 20; i++)
		printf("%d ", arr[i]);
	return 0;
}

在这里插入图片描述
这样我们就得到了一个大根堆。
(大根堆和小根堆就差在adjustup所以这里就不举大根堆的例子了)

向下建堆

在这里插入图片描述
这是向下调整的思路,同向上调整一样,向下调整则是要求下面的数都是堆。

在这里插入图片描述

所以比较于前面的向上调整是从上面一个一个调整,向下调整是要从下面开始一个一个调整

那我们就要从最底下的19一个一个开始调整嘛?
其实也不用这么麻烦
我们可以从30开始的最后一个根开始一个一个调整。
在这里插入图片描述
1:调整30这个最后一个根
2:调整25这个根
3:调整7这个根,前面调整了30和25,保证了n下面的数据都成一个堆

void Swap(int* arr, int x, int y)
{
	int tmp = arr[x];
	arr[x] = arr[y];
	arr[y] = tmp;
}
void AdjustDown(int* a, int n, int parent)
{
	int child = 2 * parent + 1;
	while (child < n)
	{
		if (child + 1 < n && a[child] < a[child+1])
		{
			child++;
		}
		if (a[child] > a[parent])
		{
			Swap(a, child, parent);
			parent = child;
			child = parent * 2 + 1;
		}
		else
		{
			break;
		}
	}
}
void creatheap(int* arr,int size)
{
	for (int i = (size-1-1)/2; i>=0; i--)
	{
		AdjustDown(arr,size,i);
	}
}
int main()
{
	int arr[20] = { 54,76,23,58,167,367,235,651,764,126,538,12,79,23,46,13,67,38,30,15 };
	creatheap(arr,20);
	for (int i = 0; i < 20; i++)
		printf("%d ", arr[i]);
	return 0;
}

这样就建好了一个大根堆。

堆排序

在这里插入图片描述
当我们建立好一个大根堆时

我们发现大根堆的特点是其最顶端的数据一定是最大的一个数。
这里我们就能想到
为什么我们不每次取出顶端最大的值,然后再进行向下调整,然后再得到最大值,不断循环呢?

这里确实是这样一个思路,但是我们在我们取出最大值时,那最大值要用什么数来填补呢?
这个时候我们就能想到堆的删除数据操作了。
在这里插入图片描述
这就是我们的交换删除法。
完美契合堆排序的要求。

void creatheap(int* arr,int size)
{
//前面建堆的部分
	for (int i = (size-1-1)/2; i>=0; i--)
	{
		AdjustDown(arr,size,i);
	}
	int end = size - 1;
	//排序部分
	while (end >= 0)
	{
		Swap(arr, 0, end);
		end--;
		AdjustDown(arr, end+1, 0);
	}
}


结果也是完美的正确了。

top-k问题,建堆的应用

问题:在一堆数据中,选出k个最大(最小)的数据

解决思路:如果要选取最大的k个数
1:在数据前k个建小根堆
2:遍历数据k后的每个数,如果大于小根堆的顶部数据,则将两个数据进行交换
3:对新的顶部数据进行向下调整,使顶部的数据重新变回k堆的最小值。
4:直到数据遍历完成,最后输出即可。

这里就不贴代码了,就交给感兴趣的人自己去完成吧

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

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

相关文章

Springboot基础学习之(二十三):实现定时任务

定时任务&#xff1a;在开发过程中是经常能够使用到的&#xff1a;定时发布邮件等等 先了解一下什么时cron表达式&#xff1f; 它是定义执行任务时间的一种时间表达式&#xff0c;使用方法 Scheduled(cron "0/2 * * * * ? ")&#xff0c;这里代码的含义是每两秒执行…

适用于 Windows 的 5 个最好的 PDF 转换器应用程序

由于稳定性、高分辨率、高安全性、易于传输等特点&#xff0c;PDF已经成为我们日常工作中最常用的格式。我们在享受PDF带来便利的同时&#xff0c;也发现PDF带来了一些不便&#xff0c;其中最大的问题就是PDF内容的编辑难度。同时&#xff0c;并不是所有的文件都是PDF格式的&am…

【redis】Redis为什么能抗住10万并发?

文章目录1. Redis简介2. 内存操作3. 丰富的对象类型4. 高效的数据结构5. 单线程模型6. 多路IO复用模型7. 总结1. Redis简介 Redis是一个开源的&#xff0c;基于内存的&#xff0c;高性能的键值型数据库。它支持多种数据结构&#xff0c;包含五种基本类型 String&#xff08;字…

搭建vue3项目+按需引入element-ui框架组件

场景&#xff1a;使用vue create脚手架快速搭建vue的项目 前提&#xff1a;需要安装node.js和cnpm以及yarn 并且cnpm需要设置为淘宝镜像&#xff0c;cnpm和yarn安装教程网上很多可以自行搜索 1.使用dos命令安装vue-cli脚手架 //这个是从镜像源下载 cnpm install -g vue/cli 查…

设计模式简述

设计模式(简述) 设计模式的分类 ​ 根据目的可以分为创建型、结构性和行为型三类&#xff1a; 创建型模型&#xff1a;创建对象结构性模型&#xff1a;处理类或对象的组合行为型模式&#xff1a;用于描述对类或对象怎样交互和怎么分派职责 ​ 根据范围可以分为类模式和对象…

13.基于双层优化的电动汽车日前-实时两阶段市场竞标

MATLAB代码&#xff1a;基于双层优化的电动汽车日前-实时两阶段市场竞标 关键词&#xff1a;日前-实时市场竞标 电动汽车 双层优化 编程语言&#xff1a;MATLAB平台 内容简介&#xff1a;代码主要做的是电动汽车充电站市场竞标策略&#xff0c;采用双层优化模型对电动汽车…

Redis缓存穿透、击穿、雪崩面试题详解

缓存穿透 问题&#xff1a; 指的是客户端请求的数据在缓存中找不到&#xff0c;数据库中也没有存储&#xff0c;客户端还不断的发起请求。这样每次都无法在数据库查询到&#xff0c;缓存中永远没有这个数据。 ​ 这样的话&#xff0c;客户端一直去访问&#xff0c;会给后端数据…

【观察】解读新一代戴尔AMD服务器:场景优化为先,筑牢数字化底座

毫无疑问&#xff0c;今天算力就是生产力已成为业界共识&#xff0c;特别是算力作为数字经济时代的关键生产力要素&#xff0c;更成为了挖掘数据要素价值&#xff0c;推动数字经济发展的核心支撑力和驱动力。 在此过程中&#xff0c;由算力驱动的数字经济除了以信息产业这一独立…

老胡的周刊(第087期)

老胡的信息周刊[1]&#xff0c;记录这周我看到的有价值的信息&#xff0c;主要针对计算机领域&#xff0c;内容主题极大程度被我个人喜好主导。这个项目核心目的在于记录让自己有印象的信息做一个留存以及共享。 &#x1f3af; 项目 Auto-GPT[2] Auto-GPT 是一个实验性的开源应…

极简sklearn-使用决策树预测泰坦尼克号幸存者

泰坦尼克号幸存者数据集是kaggle竞赛中入门级的数据集&#xff0c;今天我们就来用决策树来预测下哪些人会成为幸存者。 数据集下载地址: https://download.csdn.net/download/ting4937/87630361 数据集中包含两个csv文件&#xff0c;data为训练用数据,test为测试集。 探索数据…

通过HBuilderX运行uniapp到微信者开发工具

目录 一、安装开发工具 二、配置运行微信开发者工具 三、异常处理 1.[微信小程序开发者工具] ? Enable IDE Service (y/N) [27D[27C 2. [error] Error: Fail to open IDE 3.[app.json 文件内容错误] app.json: 在项目根目录未找到 app.json 一、安装开发工具 安装HBuil…

如今的就业环境下,怎样才能跻身于高收入的IC行业?

看到不少人失业找工作&#xff0c;其实现在不光是大学生难找工作&#xff0c;在职的人工作也不怎么开心。 要么累&#xff0c;要么没前途。 要么又累又没前途。 总的占个啥吧&#xff0c;现在大家面临的问题就是工作时间越来越久&#xff0c;人际关系也搞得很压抑&#xff0…

初识linux之线程同步与生产者消费者模型

目录 一、线程同步的概念 1. 饥饿状态 2. 同步的概念 二、生产者消费者模型 1. 生产者消费者模型基本概念 2. 生产者、消费者之间的关系 2.1 消费者与消费者的关系 2.2 生产者和生产者的关系 2.3 生产者和消费者的关系 3. “321”原则 4. 消费者与生产者模型的特点 …

C++数据结构:STL

数据结构和算法简介 数据结构 数据结构是相互间存在特定关系的数据的集合&#xff0c;分为逻辑结构和物理结构。 逻辑结构 反映数据元素之间的逻辑关系的数据结构&#xff0c;其中的逻辑关系是指数据元素之间的前后件关系&#xff0c;而与他们在计算机中的存储位置无关 集…

类加载器详解(重点)之双亲委派

回顾一下类加载过程 开始介绍类加载器和双亲委派模型之前&#xff0c;简单回顾一下类加载过程。 类加载过程&#xff1a;加载->连接->初始化。连接过程又可分为三步&#xff1a;验证->准备->解析。 加载是类加载过程的第一步&#xff0c;主要完成下面 3 件事情…

多线程基础

1.多线程基础概念 多线程&#xff1a;让程序同时做多件事情 多线程作用&#xff1a;提高效率 并发&#xff1a;在同一时间&#xff0c;有多个指令在单个cpu上交替执行 并行&#xff1a;在同一时刻&#xff0c;有多个指令在多个cpu上同时执行 2.多线程的实现 (1)继承Thread类…

计算机网络问题

1.网络分层结构及其必要性 五层体系结构&#xff1a; 七层结构&#xff1a; 应用层&#xff1a;网络服务与最终用户的一个接口&#xff0c;常见的协议有&#xff1a;HTTP FTP SMTP SNMP DNS.表示层&#xff1a;数据的表示、安全、压缩。&#xff0c;确保一个系统的应用层所发…

『Linux笔记』Linux设置SSH远程连接Docker容器

Linux设置SSH远程连接Docker容器 文章目录 一. 创建容器二. 进入容器/设置密码三. 安装ssh及修改配置四. 重启ssh服务五. 远程连接六. 提交运行中的容器docker commit参考文章 一. 创建容器 在ubuntu镜像中创建容器&#xff0c;并将docker服务器的60222端口映射到容器的22端口…

如何将Tomcat集成到IDEA中并启动项目?

编译软件&#xff1a;IntelliJ IDEA 2019.2.4 x64 操作系统&#xff1a;win10 x64 位 家庭版 服务器软件&#xff1a;apache-tomcat-8.5.27 目录一、为什么要将Tomcat集成到IDEA里&#xff1f;二、集成步骤2.1 在IDEA中创建Tomcat2.2 创建java的企业级模块&#xff08;动态的we…

同为科技(TOWE)8路RS485通讯智能机柜PDU时序电源管理器

智能PDU电源时序管理器的出现是为了更好地管理数据中心和服务器机房的电源&#xff0c;以提高其可靠性和效率。在传统的机房电力管理中&#xff0c;运维人员需要手动控制每个设备的电源开关和电力分配&#xff0c;这种方式不仅效率低下&#xff0c;而且容易出现操作失误和电源供…