考研算法30天:堆排序 【堆排序】

news2024/11/19 17:41:35

原先自己写过这道题的题解,但是当时水平有限所以这次重写一次。

(1条消息) 堆的创建(题目:堆排序)_空が笑っています的博客-CSDN博客

算法介绍

我在上陈越姥姥的课程之后我学会了如何用数组表示一个堆(堆其实就是根节点大于或者小于它的子节点的完全二叉树)然后陈越姥姥创建堆的思路是每次将新节点放到数组的最后然后通过和自己的父节点比较然后找到自己的位置然后插入。

void insert(int X){
    int i;
    for(i = ++size ; X<H[i/2] ; i = i/2){
        H[i] = H[i/2];
    }
    H[i] = X;
}

我觉得陈越姥姥的这个思路更加简单而且更容易理解的,如果一道题只需要插入的话,我觉得这个方式是最好的。 

但是看这道题它是需要你顺序排序的,那么我觉得最简单的思路有两种

第一种建立最小堆,然后每次将最小的(堆顶元素)弹出并输出。

第二种是建立最大堆,然后每次将最大的(堆顶元素)放入栈,然后根据栈先进后出的思路将元素弹出。(y总虽然没使用栈,但是我觉得思路差不多。)

我们很快发现不管是哪种方式,我们都需要删除的操作,所以姥姥的方式在这道题上就不太适用了。我们应该将这种调整元素位置的代码抽象出来并且可以用于删除。下面这种方式也是是从下面向上比较(每次父节点和自己的左右节点比较然后自己和自己的左右节点就在自己为根节点的二叉树中形成了堆,从n/2开始是因为下标比N/2大的节点是没有自己的子节点的了)


void down(int u){
    int t=u;
    if(mysize >= u * 2 && h[t] > h[u * 2]) t = u * 2;
    if(mysize >= (u * 2 + 1) && h[t] > h[u * 2 + 1]) t = u * 2 + 1;
    if(t != u){
        swap(h[u],h[t]);
        down(t);
    }
}

算法题目

#include <iostream>

using namespace std;

const int N = 1000010;
int q[N],sz;

void down(int x){
    //n/2就是有子节点最大的下标。
    //注意:这道题我们的n和size并不等价,size因为删除的原因
    //size会一直变。
    if(x>(sz/2))return;
    int t = x;
    //将根节点和其左右节点三者比较将最大的节点放到根节点上
    if(x*2<=sz  && q[x*2] > q[t]) t = x*2;
    if((x*2+1)<=sz && q[x*2+1] > q[t]) t = x*2 +1;
    if(t!=x){
        swap(q[t],q[x]);
        //如果下面子节点还有节点的话,就继续遍历
        //没有就返回,这道题上是不会有的,
        //因为我们一开始就是从n/2开始向下down的
        //而n/2就是有子节点最大的下标。
        down(t);
    }
}

void heap_sort(int n){
    sz = n;
    for(int i=n/2;i;i--) down(i);
    for(int i=n-1;i>=0;i--){
        //将根节点(最大的节点)和最后的节点交换位置
        swap(q[1],q[sz]);
        //然后删除最大的节点。
        sz--;
        //因为刚才将最后的节点放到了根节点的位置
        //所以我们需要从1开始向下再down一次
        down(1);
    }
    return;
}
int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)scanf("%d",&q[i]);
    heap_sort(n);
    for(int i=1;i<=n;i++)printf("%d ",q[i]);
    return 0;
}

 

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

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

相关文章

本地已安装Git。 但是VSCode提示:未找到 Git。点击Git侧边栏选项,按钮都是灰的

问题&#xff1a; 解决方案&#xff1a; 1、点击设置 2、在输入框中输入git.path&#xff0c;然后点击“在settings.json中编辑”&#xff0c; 打开settings.json文件&#xff0c;进行git.path配置&#xff1b; 3、配置git.path&#xff0c;下面两种格式都可以&#xff0c;设…

Google Hacking爬虫修改版

这里是个演示 项目是根据这个项目进行修改的 修改了哪些东西&#xff1a; 新增个模式&#xff0c;一个Request&#xff0c;一个Selenium原版只能读第一页&#xff0c;修改成可以自动判断添加了更多的搜索摸板输出csv&#xff0c;url标题域名 针对第三点&#xff1a; 添加了一…

自学黑客(网络安全),一般人我劝你还是算了吧(自学网络安全学习路线--第十三章 网络应用安全上)【建议收藏】

文章目录 一、自学网络安全学习的误区和陷阱二、学习网络安全的一些前期准备三、自学网络安全学习路线一、网络攻击的步骤1、搜集初始信息2、搜确定攻击目标的IP地址范围3、扫描存活主机开放的端口4、分析目标系统 二、口令安全1、口令破解2、口令破解方法3、设置安全的口令4、…

【pycharm】 Anaconda3 和 pycharm 安装配置1

anaconda3 下载地址 Anaconda3-2023.03-1-Windows-x86_64.exeC:\ProgramData\anaconda3 安装路径解释器默认是从online下载 或者3.10 实际上我在tbuild下有python3.9

python spider 爬虫 之 解析 xpath 、jsonpath、BeautifulSoup (二)

Jsonpath 安装&#xff1a; pip install -i https://pypi.tuna.tsinghua.edu.cn/simple jsonpath 使用&#xff1a;jsonpath 只能解析本地文件&#xff0c;跟xpath不一样 objjson.load(open(‘json文件’&#xff0c;‘r’, encoding‘utf-8’)) json.load(是文件&#xff0c;…

关于云服务器CentOS7.6版本安装宝塔面板后,点击终端无响应解决方案

问题再现: 下面是我沟通宝塔客服后&#xff0c;给的解决方案。 我在百般无奈的情况下、卸载了宝塔后&#xff0c;最终躺平&#xff0c;选择了问宝塔官方客服 1、从华为提供的远程登录方式选一种 二、输入服务器密码通过ssh远程登录 服务器 二、执行宝塔官方提供的 命令执…

centos7 配置jenkins run docker

本机环境已有jdk11 一、安装配置maven环境 1、下载maven wget https://dlcdn.apache.org/maven/maven-3/3.9.3/binaries/apache-maven-3.9.3-bin.tar.gz 2、解压 tar -zxvf apache-maven-3.9.3-bin.tar.gz 3、移动位置 mv apache-maven-3.9.3 /usr/local/ 4、加入环境变…

Nvidia官方视频编解码性能

NVIDIA VIDEO CODEC SDK | NVIDIA Developer 1080P解码性能&#xff1a; 720P解码性能&#xff1a; 详细的参见官方的链接地址&#xff0c;对于GPU的解码fps能力&#xff0c;可以作为评估参照&#xff01;

Intellij IDEA 插件开发 | 京东云技术团队

写在前面 很多idea插件文档更多的是介绍如何创建一个简单的idea插件&#xff0c;本篇文章从开发环境、demo、生态组件、添加依赖包、源码解读、网络请求、渲染数据、页面交互等方面介绍&#xff0c;是一篇能够满足基本的插件开发工程要求的文章。 如有疏漏欢迎指正&#xff0…

汇编端口

输出年月日 时分秒 assume cs:code , ds:data data segmentdb 0 data ends code segment start:mov ax,datamov ds,axmov cx,3mov di,100mov bl,0mov ah,0mov byte ptr ds:[0],0 st1:mov al,blout 70h,alin al,71hcall showptrsub di,2add bl,2add byte ptr ds:[0],1loop st1mo…

STM32 标准库 任意长度收发

void UART5_IRQHandler(void) //串口1中断服务程序 {u8 Res;if(USART_GetITStatus(UART5, USART_IT_RXNE) ! RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾){Res USART_ReceiveData(UART5);//(USART1->DR); //读取接收到的数据USART_RX_BUF[USART_RX…

记一次PHP的laravel框架数据库查询报错500

错误的原因 是有个给第三方回调的接口&#xff0c;由于第三方接口是不需要传token的因此在本地测试的时候&#xff0c;我们是将Header加入token的字段&#xff0c;测试一切正常&#xff0c;但是到显示调试过程中一直出现500。 经过不断地定位&#xff0c;发现是在通过订单号到…

almalinux下卸载并升级安装10.9的mariadb(实操)

MariaDB 简介 MariaDB Server 是一个通用的开源关系数据库管理系统。 它是世界上最受欢迎的数据库服务器之一&#xff0c;拥有包括 Wikipedia、WordPress.com 和 Google 在内的知名用户。 MariaDB Server 在 GPLv2 开源许可下发布&#xff0c;并保证保持开源。 它可用于高可用…

一、枚举类型——用枚举实现职责链模式

职责链&#xff08;Chain of Responsibility&#xff09;设计模式先创建了一批用于解决目标问题的不同方法&#xff0c;然后将它们连成一条“链”。当一个请求到达时&#xff0c;会顺着这条链传递下去&#xff0c;直到遇到链上某个可以处理该请求的方法。 可以很容易地用常量特…

魔兽世界自己架设私人服登录不了服务器

要在自己的计算机上架设魔兽世界私人服服务器需要进行如下步骤&#xff1a; 1. 下载和安装魔兽世界服务器文件 首先需要去官网下载和安装魔兽世界服务器文件并进行配置。这一步很关键&#xff0c;因为要确保服务器安装和配置正确&#xff0c;才能保证能够顺利地登录服务器。 …

怎么将pdf A3版转换为A4版

借助WPS进行分割(需开通会员) 步骤一&#xff1a;在WPS中打开PDF文件&#xff0c;点击菜单栏中的“编辑”——“分割页面”功能&#xff0c;进入分割界面&#xff0c;设置分割线的数量和位置&#xff0c;接着点击“立即分割”就能快速将PDF分割成两页了 步骤二&#xff1a;点击…

Flink-SQL 写入PostgreSQL 问题汇总

​ 1.主键字段为空问题 错误信息 org.apache.flink.table.api.TableException: Column bus_no is NOT NULL, however, a null value is being written into it. You can set job configuration table.exec.sink.not-null-enforcerDROP to suppress this exception and drop …

用Excel生成Sql:

用Excel生成Sql: 以如图为例&#xff1a;点击一行数据的后面一个单元格&#xff0c;在上面的fx部分输入&#xff0c;以等号开头证明这是一个公式。在等号的后面写上想要添加的数据&#xff0c;书写规范是这样&#xff1a;“&A2&”表示varchar类型&#xff1b;"&am…

你知道什么是生成对抗网络吗

生成对抗网络&#xff08;GANs&#xff09;是一种深度学习模型&#xff0c;已经显示出在许多生成相关任务中的卓越性能。最近几年&#xff0c;越来越多的研究人员将注意力集中于 GAN 的隐空间属性&#xff0c;并提出了许多利用这些属性进行语义图像编辑的方法。然而&#xff0c…

STM32CubeMX联合CLion开发环境搭建

STM32CubeMX联合CLion开发环境搭建 文章目录 STM32CubeMX联合CLion开发环境搭建1. STM32CubeMX与CLion简介1.1 STM32CubeMX1.2 HAL库1.3 CLion 2. 部署过程2.1 软件部署环境2.2 STM32CubeMX下载及安装2.2 OpenOCD下载与安装2.3 CLion设置 3. 第一个STM32项目 1. STM32CubeMX与C…