排序算法(二)--堆排序(JAVA)

堆的一个很重要的应用就是堆排序,和快速排序一样,堆排序的时间复杂度也是O(NlgN)
堆排序的实现思路一:
1.创建小根堆
2.每次删除顶部元素并将顶部元素输出(删除的函数中有调整的过程,每次调整)
时间复杂度:O(N·logN)

Input:
14
99 5 36 2 19 1 46 12 7 22 25 28 17 92

Output:
1 2 5 7 12 17 19 22 25 28 36 46 92 99

import java.util.Scanner;
public class heap {static int n, num = 0;static int[] h = new int[15];static Scanner input = new Scanner(System.in);public static void main(String[] args) {n = input.nextInt();for (int i = 1; i <= n; i++) {h[i] = input.nextInt();}num = n;create();for (int i = 1; i <= n; i++) {System.out.print(deletemax() + " ");}}private static void create() {/*** 从最后一个非叶结点到第1个结点向上调整* */for (int i = num / 2; i >= 1; i--) {siftdown(i);}}private static int deletemax() {int temp = h[1];h[1] = h[num];num--;siftdown(1);return temp;}private static void siftup(int i) {int flag = 0;/*** 堆顶* */if (i == 1) {return;}while (i != 1 && flag == 0) {/*** 当前节点是否小于父结点* */if (h[i] < h[i/2]) {int temp = h[i];h[i] = h[i/2];h[i/2] = temp;} else {flag = 1;}/*** 向上调整* */i = i/2;}}private static void siftdown(int i) {int t, flag = 0;while (i * 2 <= num && flag == 0) {if (h[i] > h[i*2]) {t = i * 2;} else {t = i;}if (i * 2 + 1 <= num) {if (h[t] > h[i * 2 + 1]) {t = i * 2 + 1;}}if (t != i) {int temp = h[t];h[t] = h[i];h[i] = temp;i = t;} else {flag = 1;}}}
}

堆排序的实现思路二:
1.创建大根堆
2.h[1]与h[n]交换
3.对h[1]向下调整, n–
时间复杂度:O(N·logN)

Input:
14
99 5 36 2 19 1 46 12 7 22 25 28 17 92

Output:
1 2 5 7 12 17 19 22 25 28 36 46 92 99

import java.util.Scanner;
public class heapPlus {static int num, n = 0;static int[] h = new int[15];static Scanner input = new Scanner(System.in);public static void main(String[] args) {n = input.nextInt();for (int i = 1; i <= n; i++) {h[i] = input.nextInt();}num = n;create();heapsort();for (int i = 1; i <= n; i++) {System.out.print(h[i] + " ");}}private static void heapsort() {while (num > 1) {int temp = h[num];h[num] = h[1];h[1] = temp;num--;siftdown(1);}}private static void create() {/*** 从最后一个非叶结点到第1个结点向上调整* */for (int i = num / 2; i >= 1; i--) {siftdown(i);}}private static void siftup(int i) {int flag = 0;/*** 堆顶* */if (i == 1) {return;}while (i != 1 && flag == 0) {/*** 当前节点是否小于父结点* */if (h[i] > h[i/2]) {int temp = h[i];h[i] = h[i/2];h[i/2] = temp;} else {flag = 1;}/*** 向上调整* */i = i/2;}}private static void siftdown(int i) {int t, flag = 0;while (i * 2 <= num && flag == 0) {if (h[i] < h[i*2]) {t = i * 2;} else {t = i;}if (i * 2 + 1 <= num) {if (h[t] < h[i * 2 + 1]) {t = i * 2 + 1;}}if (t != i) {int temp = h[t];h[t] = h[i];h[i] = temp;i = t;} else {flag = 1;}}}
}

堆是一种优先队列的数据结构
对于普通队列来说,在进行插入操作时比较方便,但是如果寻找队列中最大(或最小)的元素则时间复杂度较高;
对于已排序的数组来说,查找最大(或最小)元素并不在话下,但是插入元素则需要后面的元素整体后移,时间复杂度依旧很高。
而优先队列这种结构,则可以很好的解决上面的两种操作。
之前的Dijkstra算法就可以通过堆来进行优化。

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

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

相关文章

看后端程序员调试CORS的姿势

# 目录 为什么有同源策略&#xff1f; 需要解决的问题CORS跨域请求方案 preflightwithCredentials附&#xff1a;高效、优雅地调试CORS实现为什么有同源策略&#xff1f; 同源策略Same Origin Policy 是一种约定&#xff0c;是浏览器最核心的安全功能&#xff1a;该策略允许在…

堆的应用--并查集解决“擒贼先擒王”问题(JAVA)

现在有10个强盗。 1号强盗与2号强盗是同伙。 3号强盗与4号强盗是同伙。 5号强盗与2号强盗是同伙。 4号强盗与6号强盗是同伙。 2号强盗与6号强盗是同伙。 8号强盗与7号强盗是同伙。 9号强盗与7号强盗是同伙。 1号强盗与6号强盗是同伙。 2号强盗与4号强盗是同伙。 另外…

UVa 201 Square

这道题&#xff0c;没什么&#xff0c;就查找正方形&#xff0c; 特别注意一下 \n 的使用。 //UVa 201 //Square //#define LOCAL #include <stdio.h> #include <string.h> //use memset int dot[11][11][11][11], N;int getS(int size) {int cnt 0, flag;for(…

图论算法(四)--最小生成树的Kruskal [ 加边 ] 、Prim [ 加点 ] 的解法(JAVA)

之前我们介绍了求最短路径算法&#xff0c;现在又讲最小生成树算法&#xff0c;这两个算法有什么区别呢&#xff1f; 首先要明确&#xff0c;最短路径和最小生成树是两个不同的概念。 最短路径是对于一个图的两个结点而言的。在一个图中&#xff0c;结点A通过某些结点和边可以…

图论算法(五)--求解割点、割边(JAVA)

割点&#xff1a;对于一个连通图来说&#xff0c;如果删除某个点之后图不再连通&#xff0c;这个点就称为割点 割点算法 时间复杂度&#xff1a;O(NM) 但是下面给出的算法时间复杂度为O(N^2)&#xff0c;这是因为下面的存储结构都是邻接矩阵&#xff0c;这样的话用该算法就完…

express+handlebars 快速搭建网站前后台

最近在重构公司网站&#xff0c;原来网站使用PHP&#xff0c;前后端不分离&#xff0c;添加与更新网站内容仍使用原始方法&#xff0c;先出布局再把调好的布局给PHP后端开发&#xff0c;花时间长&#xff0c;维护不易。因此决定将网站前后端分离&#xff0c;核心功能含网站下单…

图论算法(六)-- 二分图的最大分配问题(JAVA)

二分图&#xff1a;又称二部图&#xff0c;如果一个图的所有顶点可以被分为X和Y两个集合&#xff0c;并且所有边的两个顶点恰好一个属于一个集合X&#xff0c;另一个属于集合Y&#xff0c;即每个集合内的顶点没有边相连&#xff0c;那么这个图就是二分图。 二分图的最大分配问…

定义一个二维数组并输入数据,将二维数组元素的值按升序排列,并输出排序后的二维数组。

目录 问题&#xff1a; 回顾&#xff1a; 给出两种做法&#xff1a; 解法一&#xff1a;调用qsort 函数进行排序 代码&#xff1a; 运行结果&#xff1a; 解法二&#xff1a;冒泡排序 代码&#xff1a; 运行结果: 回顾里的4种方法的模板参考&#xff1a; 1.冒泡排序…

.net core中使用GB2312编码

引用 System.Text.Encoding.CodePages 注册 Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);转载于:https://www.cnblogs.com/liushunli/p/10342521.html

实验吧-密码学-杯酒人生(特殊凯撒--维吉尼亚密码)(凯撒加解密脚本、维吉尼亚密码加解密脚本)...

题目&#xff1a; 使用古典密码 一喵星人要想喵星发送一段不知道干什么用的密码“BLOCKCIPHERDESIGNPRINCIPLE”&#xff0c; 但是它忘记了密钥是什么&#xff0c; 手头&#xff08;爪头&#xff09;只有它自己加密过的密钥“HTRUZYJW”&#xff0c; 而且它 还知道原密钥是一个…

第五届省赛(软件类)真题----Java大学C组答案及解析

第五届省赛&#xff08;软件类&#xff09;真题—-Java大学C组答案及解析 杨辉三角调和级数回文素数过大年位平方和单位分数n级台阶 一、杨辉三角 二项式的系数规律&#xff0c;我国数学家很早就发现了。 如【图1.png】&#xff0c;我国南宋数学家杨辉1261年所著的《详解九…

Angular4.x 安装|创建项目|目录结构|创建组件

Angular4.x 安装|创建项目|目录结构|创建组件 安装最新版本的 nodejs node.js 官网&#xff1a;https://nodejs.org/zh-cn/ 去官网下载 node.js&#xff0c;下一步下一步就可以了。只要 node.js 安装成功&#xff0c;那么 npm 也会帮你安装完成&#xff01; 注意&#xff1a;请…

第五届省赛(软件类)真题----Java大学B组答案及解析

第五届省赛&#xff08;软件类&#xff09;真题—-Java大学B组答案及解析 正则切分调和级数n的n次幂七对数字勾股定理九阶数独G将军 一、正则切分 java中提供了对正则表达式的支持。 有的时候&#xff0c;恰当地使用正则&#xff0c;可以让我们的工作事半功倍&#xff01; …

第五届省赛(软件类)真题----Java大学A组答案及解析

第五届省赛&#xff08;软件类&#xff09;真题—-Java大学A组答案及解析 子序列最大长度莱布尼茨公式n的n次幂七对数字勾股定理九阶数独矩阵射线 一、子序列最大长度 一个串的子串是指该串的一个连续的局部。如果不要求连续&#xff0c;则可称为它的子序列。 比如对串&…

js获取一个月的天数

在使用其他语言获取每月天数的时候&#xff0c;一般都是存储到一个数组中进行获取&#xff0c;但是如果是二月份的话就需要首先判断是否闰年&#xff0c;再确定是28还是29了。 js可以通过Date对象很方便的获取到每月的天数&#xff0c;在初始化Date对象时&#xff0c;我们可以通…

第六届省赛(软件类)真题----Java大学C组答案及解析

第六届省赛&#xff08;软件类&#xff09;真题----Java大学C组答案及解析隔行变色立方尾无穷分数循环节长度格子中输出奇妙的数字加法变乘法移动距离打印大X垒骰子 一、隔行变色 Excel表的格子很多&#xff0c;为了避免把某行的数据和相邻行混淆&#xff0c;可以采用隔行变色的…

spring_01概念及案例

1.什么是IOC?   IOC概念:inverse of Controll,控制反转,所谓控制反转,就是把创建对象和维护对象关系的权利从程序中转移到spring的容器中(applicationContext.xml),而程序本身不再维护 2.什么是di? dependency injection,依赖注入,di和IOC是一个概念,spring的设计者认为di等…

斐波那契数列(二)--矩阵优化算法

之前写了一篇从斐波那契数列分析递归与动态规划&#xff08;JAVA&#xff09;来优化斐波那契数列&#xff0c;这样可以使算法的时间复杂度从O(n^2)变到O(n),这是使用递归公式f(n)f(n-1)f(n-2)求斐波那契数列的最优算法&#xff0c;但是这只是一维世界下的极限。下面我们将其从一…

第六届省赛(软件类)真题----Java大学B组答案及解析

第六届省赛&#xff08;软件类&#xff09;真题----Java大学B组答案及解析三角形面积立方变自身三羊献瑞循环节长度九数组分数加法变乘法牌型种数饮料换购垒骰子生命之树 一、三角形面积如【图1】所示。图中的所有小方格面积都是1。那么&#xff0c;图中的三角形面积应该是多少…

【学习总结】GirlsInAI ML-diary day-11-while循环

【学习总结】GirlsInAI ML-diary 总 原博github链接-day11 认识while循环执行 对于while/break/continue的认识 新值替换变量 一般while语句 无限循环 & break continue 作业 1-更新变量 这一条没什么新的东西&#xff0c;别的语言也一样&#xff1a;python在赋值时&#x…