hnust 1817 算法10-10,10-11:堆排序

hnust 1817 算法10-10,10-11:堆排序

题目描述
堆排序是一种利用堆结构进行排序的方法,它只需要一个记录大小的辅助空间,每个待排序的记录仅需要占用一个存储空间。
首先建立小根堆或大根堆,然后通过利用堆的性质即堆顶的元素是最小或最大值,从而依次得出每一个元素的位置。
堆排序的算法可以描述如下:
在这里插入图片描述

在本题中,读入一串整数,将其使用以上描述的堆排序的方法从小到大排序,并输出。

输入
输入的第一行包含1个正整数n,表示共有n个整数需要参与排序。其中n不超过100000。
第二行包含n个用空格隔开的正整数,表示n个需要排序的整数。
输出
只有1行,包含n个整数,表示从小到大排序完毕的所有整数。
请在每个整数后输出一个空格,并请注意行尾输出换行。
样例输入 Copy
10
2 8 4 6 1 10 7 3 5 9
样例输出 Copy
1 2 3 4 5 6 7 8 9 10
提示
在本题中,需要按照题目描述中的算法完成堆排序的算法。
堆排序对于元素数较多的情况是非常有效的。通过对算法的分析,不难发现在建立含有n个元素的堆时,总共进行的关键字比较次数不会超过4n,且n个节点的堆深度是log2n数量级的。因此,堆排序在最坏情况下的时间复杂度是O(nlog2n),相对于快速排序,堆排序具有同样的时间复杂度级别,但是其不会退化。堆排序较快速排序的劣势是其常数相对较大。

解题过程

堆排序是一种利用堆数据结构的排序算法,分为两个阶段:建立堆和堆排序。

下面是对代码的详细解析:

  1. 头文件

    • 包含 <stdio.h><string> 头文件,分别提供输入输出功能和字符串操作。
  2. 命名空间

    • 使用 using namespace std; 来避免在标准库类型和函数前加 std::
  3. 常量定义

    • maxn 定义了数组 heap 的最大长度。
  4. 全局数组 heap

    • 用作堆数据结构的存储空间。
  5. 交换函数 swap

    • 通过引用传递参数,实现两个整数的交换。
  6. 下沉调整函数 downAdjust

    • 从指定位置 low 开始,到 high 结束,对堆进行下沉调整,确保堆的性质。
  7. 创建堆函数 createheap

    • n/2 开始,向下对每个节点调用 downAdjust,以构建最小堆。
  8. 堆排序函数 heapsort

    • 首先调用 createheap 创建最小堆。
    • 然后交换堆顶元素(最小元素)和最后一个元素,减少堆的大小,并下沉调整堆。
  9. 主函数 main

    • 读取整数 n,直到输入结束或 n 为0。
    • 读取 n 个整数,存储到 heap 数组中。
    • 调用 heapsort 函数进行堆排序。
    • 打印排序后的数组,每个数字后跟一个空格。
  10. 程序结束

    • 输入结束后,程序返回0,表示正常结束。

代码逻辑分析

  • 这段代码首先读取要排序的数组长度 n,然后读取 n 个整数,存储到 heap 数组中。
  • 使用 heapsort 函数对数组进行排序,该函数首先创建一个最小堆,然后通过交换和下沉调整将元素按顺序输出。

潜在问题

  • 代码中使用了 getchar() 来读取输入中的换行符,这可能会导致在某些输入情况下出现意外行为。

改进建议

  • 考虑使用 std::cinstd::getline 替代 scanfgetchar() 来处理输入,以提高代码的可读性和健壮性。
  • 可以添加对输入数据有效性的检查,确保读取的是有效的整数。
  • 考虑使用更现代的C++特性,如 std::vector,以提高代码的灵活性。

部分代码

代码如下( 交换):

void swap(int &a,int &b){int temp;temp=a;a=b;b=temp;
}

代码如下( 对堆进行下沉调整):

void downAdjust(int low,int high){int i=low;int j=2*i;while(j<=high){if(j+1<=high&&heap[j+1]<heap[j])j++;if(heap[j]<heap[i]){swap(heap[i],heap[j]);i=j;j=2*i;}else{break;}}
} 

代码如下( 创建堆):

void createheap(int n){for(int i=n/2;i>=1;i--){downAdjust(i,n);}
}

代码如下(排序):

void heapsort(int n){createheap(n);for(int i=n;i>1;i--){swap(heap[i],heap[1]);downAdjust(1,i-1);}
}

AC代码

#include<stdio.h>
#include<string>
#include<string.h>
using namespace std;
const int maxn=100000;
int heap[maxn];
void swap(int &a,int &b){int temp;temp=a;a=b;b=temp;
}
void downAdjust(int low,int high){int i=low;int j=2*i;while(j<=high){if(j+1<=high&&heap[j+1]<heap[j])j++;if(heap[j]<heap[i]){swap(heap[i],heap[j]);i=j;j=2*i;}else{break;}}
} 
void createheap(int n){for(int i=n/2;i>=1;i--){downAdjust(i,n);}
}
void heapsort(int n){createheap(n);for(int i=n;i>1;i--){swap(heap[i],heap[1]);downAdjust(1,i-1);}
}
int main()
{int n;while(scanf("%d",&n)!=EOF&&n!=0){getchar();for(int i=1;i<=n;i++){scanf("%d",&heap[i]);getchar();}heapsort(n);for(int i=n;i>0;i--){printf("%d ",heap[i]);}printf("\n");}return 0;
}

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

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

相关文章

【算法篇】查找字符串数组中的最长公共前缀

问题描述: 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 “”“”。 示例 1: 输入: [“flower”,“flow”,“flight”] 输出: “fl” 示例 2: 输入: [“dog”,“racecar”,“car”] 输出: “” 解题 为了解决这个问题,我们可以遍历…

pppd 返回错误码 含义

错误码 00&#xff1a; pppd已经断开&#xff0c;或者已经成功建立连接后请求方又中 断了。 01&#xff1a; 发成了一个严重错误&#xff0c;例如系统调用失败或者访问非法内存。 02&#xff1a; 处理给定操作是检测到错误&#xff0c;例如使用两个互斥的操作。 03&#xff1a;…

如何获取Power BI的个性可视化控件?

我们在使用Power BI Desktop自带可视化控件进行报表设计的时候&#xff0c;有的时候会发现自带控件使用起来略显单薄&#xff0c;需要一些更有创意或者更能直接吸人眼球的可视化控件。 那有没有地方可以让我们找到一些个性化控件呢&#xff1f; 答案是肯定的&#xff0c;目前P…

每日一道算法题 括号的最大嵌套深度

题目 1614. 括号的最大嵌套深度 - 力扣&#xff08;LeetCode&#xff09; Python class Solution:def maxDepth(self, s: str) -> int:count0maxCount0for i in s:if i(:count1if i):maxCountmax(maxCount,count)count-1return maxCountC class Solution { public:int m…

vscode 安装Vue插件

打开扩展面板 --> 点击左侧的扩展图标&#xff0c;或者按下快捷键 Ctrl Shift X 搜索插件,在搜索框中输入 Vue vue-helper 用来快捷提示&#xff0c;如果使用elementui的话&#xff0c;插件不会自动提示&#xff0c;安装了它&#xff0c;组件、属性都会有提示了 Vetur V…

Ionic 滑动框

Ionic 滑动框 Ionic 是一个强大的开源框架,用于构建高性能、高质量的移动端和网页应用程序。它以其美观的设计和丰富的组件库而闻名,其中包括滑动框(Slide Box)。滑动框是一个多功能的组件,允许用户通过滑动来浏览图片、文本或其他内容。在本篇文章中,我们将深入探讨Ion…

嵌入式Linux系统编程 — 4.1 字符串输入输出

目录 1 字符串输出 1.1 字符串输出函数简介 1.2 示例程序 2 字符串输入 2.1 字符串输入简介 2.2 示例程序 程序运行时&#xff0c;需打印信息至标准输出 stdout 设备 或标准错误 stderr设备&#xff08;譬如屏幕&#xff09;&#xff0c;如调试信息、报错信息、中间产生的…

Java | Leetcode Java题解之第202题快乐数

题目&#xff1a; 题解&#xff1a; class Solution {private static Set<Integer> cycleMembers new HashSet<>(Arrays.asList(4, 16, 37, 58, 89, 145, 42, 20));public int getNext(int n) {int totalSum 0;while (n > 0) {int d n % 10;n n / 10;totalS…

学习python笔记:10,requests,enumerate,numpy.array

requests库&#xff0c;用于发送 HTTP 请求的 Python 库。 requests 是一个用于发送 HTTP 请求的 Python 库。它使得发送 HTTP 请求变得简单且人性化。以下是一些基本的 requests 函数及其用途&#xff1a; requests.get(url, **kwargs) 发送一个 GET 请求到指定的 URL。 i…

Windows

电脑手动设置了IP后有两个IP地址如何处理 1. WinR 打开 cmd 2. netsh winsock reset catalog 3. netsh int ip reset reset.log 4. 重启 5. 手动配置IP地址 6. 查看IP状态时&#xff0c;就不会再出现自动分配的IPC# 获取当前登录的用户及组 using System.Security.Principal;v…

实现Spring Boot与RabbitMQ消息中间件的无缝集成

实现Spring Boot与RabbitMQ消息中间件的无缝集成 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在分布式系统中&#xff0c;消息中间件扮演着至关重要的角色…

MySQL 复制技术详解

MySQL 复制技术用于在多个服务器之间同步数据&#xff0c;提高系统的可用性、可靠性和性能。本文将系统性地介绍三种主要的MySQL复制方式&#xff1a;主从复制&#xff08;Master-Slave Replication&#xff09;、主主复制&#xff08;Master-Master Replication&#xff09;、…

枫清科技创始人高雪峰:不取侥幸之利,做难而正确的事!丨数据猿专访

大数据产业创新服务媒体 ——聚焦数据 改变商业 金庸有一本著作叫做《侠客行》&#xff0c;这部武侠小说的主角叫做石破天&#xff0c;他从小的时候便跟随少林弟子习武。长大后&#xff0c;随着自己获得的感悟越来越多&#xff0c;最终选择开宗立派&#xff0c;独创一门武功行…

碧海威L7云路由无线运营版 confirm.php/jumper.php 命令注入漏洞复现(XVE-2024-15716)

0x01 产品简介 碧海威L7网络设备是 北京智慧云巅科技有限公司下的产品,基于国产化ARM硬件平台,采用软硬一体协同设计方案,释放出产品最大效能,具有高性能,高扩展,产品性能强劲,具备万兆吞吐能力,支持上万用户同时在线等高性能。其采用简单清晰的可视化WEB管理界面,支持…

React Hooks小记(十)_useCallback

useCallback 1. 语法格式 之前我们所学的 useMemo 能够达到缓存某个变量值的效果&#xff0c;而当前要学习的 useCallback 用来对组件内的函数进行缓存&#xff0c;它返回的是缓存的函数。它的语法格式如下&#xff1a; const memoCallback useCallback(cb, array)useCallb…

【ONLYOFFICE 8.1】的安装与使用——功能全面的 PDF 编辑器、幻灯片版式、优化电子表格的协作

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 一、引言二、ONLYOFFICE 简介三、安装1. Windows/Mac 安装2. 文档开发者版安装安装前准备使用 Docker 安装使用 Linux 发行版安装配置 ONLYOFFICE 文档开发者版集成和开发 四、使用1. 功能全面的 PDF 编辑器PDF 查看和导航P…

小公司做自动化的困境

1. 人员数量不够 非常常见的场景, 开发没几个, 凭什么测试要那么多, 假设这里面有3个测试, 是不是得有1个人会搞框架? 是不是得有2人搞功能测试, 一个人又搞框架, 有些脚本, 真来得及吗? 2. 人员基础不够 现在有的大公司, 是这样子协作的, 也就是某模块需求谁谁测试的, 那么…

【高级篇】性能优化:解锁数据库潜能的艺术(十)

引言 随着基础篇的结束,我们进入了MySQL高级篇的旅程,首站便是性能优化。在当今数据驱动的世界里,数据库的性能直接影响着应用的响应速度和用户体验。本章,我们将深入探讨查询优化、服务器参数调整、InnoDB引擎调优以及慢查询日志分析等关键领域,帮助你掌握解锁数据库潜能…

GEOS学习笔记(三)

LineString类型GEOS_LINESTRING double line[] {-100.0,0.0, 100.0,0.0}; GEOSCoordSequence* seq GEOSCoordSeq_copyFromBuffer( line, 2, 0, 0); GEOSGeometry* p1 GEOSGeom_createLineString(seq); GEOSGeometry* p2 GEOSGeomFromWKT("LINESTRING (100 -100.0,100.0…

交易例子----qmt实盘分钟交易例子,提供交易源代码

今天给大家一个利用qmt_trader交易策略&#xff0c;我现在实盘使用的系统是自己开发的&#xff0c;只需要把qmt_trader当中第三方库使用就可以&#xff0c;源代码开源开源直接下载 量化系统--开源强大的qmt交易系统&#xff0c;提供源代码 参考教程使用&#xff0c;下载当第三…