面试手撕堆排序

news/2024/5/5 18:34:51/文章来源:https://blog.csdn.net/qq_39473176/article/details/130055972
  • 堆排序代码如下(注释见下):

    1. 首先将待排序的数组构造成一个大根堆,此时,整个数组的最大值就是堆结构的堆顶

    2. 堆顶的数与末尾的数交换,此时,末尾的数为最大值,剩余待排序数组个数为n-1

    3. 将剩余的n-1个数构造成大根堆,再将堆顶数与n-1位置的数交换,如此反复执行,便能得到有序数组

    public class Main {void heapSort(int[] a, int n){for(int i = n / 2 - 1; i >= 0; i--){adjustHeap(a, i, n);}for(int i = n - 1; i > 0; i--){int temp = a[0];a[0] = a[i];a[i] = temp;adjustHeap(a, 0, i);}}void adjustHeap(int[] a, int i, int n){int largest = i;int l = 2* i + 1;int r = 2* i + 2;if(l < n && a[largest] < a[l]){largest = l;}if(r < n && a[largest] < a[r]){largest = r;}if(largest != i){int temp = a[largest];a[largest] = a[i];a[i] = temp;adjustHeap(a, largest, n);}}
    }
    
  • 测试用例

    public class Main {public static void main(String[] args) {int[] a = {8,4,5,7,1,3,6,2};int n = 8;heapSort(a, n);for(int i = 0; i < a.length; i++){System.out.print(a[i] + " ");}//System.out.println(Arrays.toString(a));//Arrays.toString()方法是方便数组类型输出,不用使用for遍历数组}static void heapSort(int[] a, int n){//1.建堆for(int i = n / 2 - 1; i >= 0; i--){//从第一个非叶节点开始,从下往上进行判断,每个节点都要维护堆的性质adjustHeap(a, i, n);}//2.排序for(int i = n - 1; i > 0; i--){//i必须>0,不能等于//交换堆顶元素和末尾元素int temp = a[0];a[0] = a[i];a[i] = temp;//维护剩余元素的堆的性质adjustHeap(a, 0, i);//0表示从堆顶元素开始维护,i表示剩余的元素个数,原来是n个,现在是n-1个,即i个}}//维护堆的性质(保证是一个大顶堆)static void adjustHeap(int[] a, int i, int n){//i为待维护的节点下标,n为数组长度int largest = i;//i节点为当前父节点int l = 2* i + 1;//左子节点int r = 2* i + 2;//右子节点//找出父节点,左子节点,右子节点中最大值的那个下标largestif(l < n && a[largest] < a[l]){//如果左子节点存在,且大于父节点largest = l;//交换下标}if(r < n && a[largest] < a[r]){//如果右子节点存在,且大于父节点largest = r;//交换下标}if(largest != i){//如果i位置的节点有孩子比他大//交换节点的值,让最大节点的值跑到父节点上,i节点的值跑到了左右孩子上int temp = a[largest];a[largest] = a[i];a[i] = temp;//递归处理每个子树,当前需要维护的节点下标为largestadjustHeap(a, largest, n);}}
    }
    

    输出结果
    (1)Arrays.toString(a)输出结果:
    在这里插入图片描述
    (2)for循环输出结果:
    在这里插入图片描述

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

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

相关文章

Linux设备驱动开发 - 块设备驱动ramdisk实例

By: fulinux E-mail: fulinuxsina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅&#xff01; 你的喜欢就是我写作的动力&#xff01; 目录理论来源源码编译测试理论来源 ramdisk驱动&#xff0c;区别在与使用最新的内核版本&#xff0c;比如linux-4.15。…

MySQL数据库:聚合函数、分组查询、约束、默认值设置、自增属性

一、聚合函数 1.聚合函数 在MySQL数据库中预定义好的一些数据统计函数。 2.count(*) 功能&#xff1a;统计结果条数。 3.sum(字段名) 功能&#xff1a;对指定字段的数据求和。 4.avg(字段名) 功能&#xff1a;对指定字段的数据求平均值。 5.max(字段名) 和 min(字段名) …

答疑——20年国赛题(JAVA解法)

题目链接&#xff1a;用户登录https://www.lanqiao.cn/problems/1025/learning/?page3&first_category_id1&sortstudents_count 题目描述 有 n 位同学同时找老师答疑。每位同学都预先估计了自己答疑的时间。 老师可以安排答疑的顺序&#xff0c;同学们要依次进入老…

sqoop数据导出、脚本使用

目录 准备表与数据 数据导出 脚本调用 准备表与数据 mysql表 CREATE TABLE user (id int(20),name varchar(20) )ENGINEINNODB DEFAULT CHARSETutf8; hive表 create table users( id bigint, name string ) row format delimited fields terminated by "\t";…

软考初级程序员--学习

1、十进制 转 二进制 十进制87 转换为 二进制为 1010111 2、二进制 转 十进制 二进制1010111 转换为 十进制 3、循环队列 计算长度通用公式&#xff1a; front&#xff1a;表示队首 rear&#xff1a;表示队尾 M&#xff1a;表示队列容量 队列长度 &#xff08;rear - fr…

Verilog | 二进制与格雷码

一、格雷码简介 格雷码是一个叫弗兰克格雷的人在 1953 年发明的&#xff0c;最初用于通信。格雷码是一种循环二进制码或者叫作反射二进制码。格雷码的特点是从一个数变为相邻的一个数时&#xff0c;只有一个数据位发生跳变&#xff0c;由于这种特点&#xff0c;就可以避免二进…

进销存管理系统能为企业带来哪些实际效益?

随着互联网的不断发展&#xff0c;如今的商业世界已经越来越向数字化转型。拥有一套完整的数字化的进销存管理能够极大地提升公司货物进出库存情况的效率和准确性&#xff0c;避免过程中出现不必要的错误和漏洞&#xff0c;从而帮助企业更加稳健地自我发展。那么&#xff0c;一…

3.7.2数据库系统-数据库控制技术:数据库的安全性、数据库备份与恢复技术、数据备份、数据库故障与恢复

3.7.2数据库系统-数据库控制技术&#xff1a;数据库的安全性、数据库备份与恢复技术、数据备份、数据库故障与恢复数据库的安全性数据库备份与恢复技术数据备份数据库故障与恢复数据库的安全性 在做信息系统开发的过程当中&#xff0c;数据库是其中很大的占比&#xff0c;信息…

【MySQL入门指南】数据库基本操作

文章目录MySQL库操作一、SQL语句二、创建数据库1.语法2.案例3.极其不推荐的方式三、查看数据库1.语法四、修改数据库五、删除数据库六、字符集与校验规则1.是什么2.相关指令3.校验规则的影响七、备份数据库1.基本语法2.注意事项MySQL库操作 一、SQL语句 DDL(data definition l…

Visual Studio Code跳转到CSS定义

Visual Studio Code 快速跳转到 VUE文件 或 CSS文件的定义位置&#xff08;跳转到class定义&#xff0c;跳转到css定义&#xff09;&#xff0c;插件Css Peek、Vue Peek 对提升开发效率上&#xff0c;事半功倍。 目录 1、跳转到CSS定义 1.1、CSS Peek 1.2、Vue Peek 2、其他…

全国青少年软件编程(Scratch)等级考试一级考试真题2023年3月——持续更新.....

一、单选题(共25题&#xff0c;共50分) 1. 下列说法不正确的是&#xff1f;&#xff08; &#xff09; A.可以从声音库中随机导入声音 B.可以录制自己的声音上传 C.可以修改声音的大小 D.不能修改声音的速度 试题解析&#xff1a;针对声音可以进行导入&#xff0c;上传&…

【C++】哈希的应用 -- 布隆过滤器

文章目录一、布隆过滤器的引入二、哈希函数个数的选择三、布隆过滤器的实现四、布隆过滤器的应用五、布隆过滤器总结一、布隆过滤器的引入 我们在上一节中学习了 位图&#xff0c;知道了位图可以用来快速判断某个数据是否在一个集合中&#xff0c;但是位图有如下的缺点&#x…

计网第五章.运输层—TCP的三次握手与四次挥手

以下来自湖科大计算机网络公开课笔记及个人所搜集资料 目录一、TCP三次握手建立连接为什么TCP客户进程最后还要发送一个普通的TCP确认报文段呢&#xff1f;能不能两次握手&#xff1f;总结&#xff1a;二、TCP四次挥手释放连接四次挥手过程问题1&#xff1a;TCP客户进程在发送完…

论文阅读 - ANEMONE: Graph Anomaly Detection with Multi-Scale Contrastive Learning

目录 摘要 1 简介 2 问题陈述 3 PROPOSED ANEMONE FRAMEWORK 3.1 多尺度对比学习模型 3.1.1 增强的自我网络生成 3.1.2 补丁级对比网络 3.1.3 上下文级对比网络 3.1.4 联合训练 3.2 统计异常估计器 4 EXPERIMENTS 4.1 Experimental Setup 4.1.1 Datasets 4.1.2 …

HuggingGPT强势来袭,LLM+专家模型,迈向更通用的AI

出品人&#xff1a;Towhee 技术团队 超级组合&#xff1a;HuggingFace ChatGPT HuggingGPT强势来袭。人类仿佛距离真正的AGI又更近了一步。 HuggingGPT是浙江大学与微软亚洲研究院的联手研究&#xff0c;发布之后迅速引发关注&#xff0c;已经开源。 它的使用非常简单&#x…

极氪X上市,18.98万元起售,进军紧凑豪华车市场

HiEV消息&#xff08;文/Amy&#xff09;4月12日&#xff0c;纯电SUV极氪X上市&#xff0c;共发布三个版本&#xff0c;官方零售价为&#xff1a; •ME版 五座后驱 189,800元 •YOU版 五座四驱 209,800元 •YOU版 四座后驱 209,800元全系三款车型预计将于6月起开启交付。极氪X限…

分享一个RecyclerView嵌套webview 滑动不流畅的解决方法

因RecyclerView 和webview 或者X5的webview 都具有滑动的功能 所以在做嵌套的时候 会出现滑动不流畅 等问题 解决思路 就是判断滑动的时候 是否自身消耗 或者父布局的RecycleView消耗 开发中还遇到个问题 就是 更换成x5的时候 getScrolly() 返回的一直是0 改成getWebScrollY(…

借助Nacos配置中心实现一个简易的动态线程池

目录 一、实现思路 二、实现说明概览 三、代码实现 DynamicThreadPool RejectedProxyInvocationHandler DynamicThreadPoolRegister DynamicThreadPoolRefresher 测试动态线程池 平常我们系统中定义的一些线程池如果要想修改的话&#xff0c;需要修改配置重启服务才能生…

HTTPS-TSL握手

HTTP一般基于TCP协议&#xff0c;而HTTPS就是在这之间加了SSL/TLS协议&#xff0c;那么在TCP三次握手建立TCP连接后&#xff0c;就需要TLS握手建立SSL/TLS连接。 TLS握手-流程 &#xff08;基于RSA算法&#xff09; &#xff08;1&#xff09;首先&#xff0c;客户端向服务器发…

Linux_vim编辑器

Vi编辑器是所有Unix及Linux系统下标准的编辑器&#xff0c;类似于windows系统下的notepad&#xff08;记事本&#xff09;编辑器&#xff0c;由于在Unix及Linux系统的任何版本&#xff0c;Vi编辑器是完全相同的&#xff0c;因此可以在其他任何介绍vi的地方都能进一步了解它&…