八大排序--05堆排序

假设数组 arr[]= {5,7,4,2,0,3,1,6},请通过插入排序的方式,实现从小到大排列:

方法:①利用完全二叉树构建大顶堆;

②对顶元素和堆底元素进行交换,除堆底元素之外其余元素继续构造大顶堆;

③重复步骤②,直到所有元素都不参与构建,整个数组排序完成

【完全二叉树--数据从上到下,从左到右排列】

【大顶堆--父结点的值大于或等于左右孩子结点的值】

堆顶元素和堆底元素进行交换(注:每次交换取值后都要剩余部分重新构建大顶堆)

【大顶堆的检验和调整】

1.定义parent游标指向检测的节点

2.定义parent的左孩子child(有孩子就一定会有左孩子)

3.判断有没有右孩子,如果有右孩子,左右孩子进行比较,让child指向左右孩子中的最大值。

4.parent和child指向的值进行比较,若parent值更大,则符合大顶堆;若parent的值更小,则父子节点进行交换,parent指向child,child指向其左右孩子中的最大值,继续进行比较,直到child为空或是parent指向值最大,则停止。

java 复制代码
package Java.start;

import java.util.Arrays;

public class HeapSort {
//堆排序
	public static void main(String[] args) {
		int[] arr= {5,7,4,2,0,3,1,6};
		//一、构建大顶堆
		for (int p=arr.length-1;p>=0;p--) {
			adjust(arr, p, arr.length);
		}
		//二、堆底堆顶元素进行交换
		for(int i=arr.length-1;i>0;i--) {
			int temp=arr[i];
			arr[i]=arr[0];
			arr[0]=temp;
			adjust(arr, 0, i);
		}
		//打印
		System.out.println(Arrays.toString(arr));
	}
	//堆的维护
	public static void adjust(int[] arr,int parent,int length) {
		//定义左孩子
		int child=2*parent+1;
		while(child<length) {
			//定义右孩子
			int rchild=child+1;
			if(rchild<length && arr[rchild]>arr[child]) {
				child++;
			}
			//child指向左右孩子中的最大值
			
			//父子节点进行比较
			if(arr[parent]<arr[child]) {
				//父子节点进行交换
				int temp=arr[parent];
				arr[parent]=arr[child];
				arr[child]=temp;
				//parent指向child,child继续指向左右孩子中的最大值
				parent=child;
				child=2*child+1;
			}else {
				break;
			}
		}
	}
}

结果:

相关推荐
我是无敌小恐龙18 小时前
Java基础入门Day10 | Object类、包装类、大数/日期类、冒泡排序与Arrays工具类 超详细总结
java·开发语言·数据结构·算法·贪心算法·排序算法·动态规划
极客先躯18 小时前
高级java每日一道面试题-2025年12月07日-实战篇[Dockerj]-Docker daemon 的配置文件在哪里?常用的配置项有哪些?
java·docker·配置文件的实际位置·配置文件的格式规则·常用配置项全景与分类·配置如何生效·daemon 配置折射架构思维
云烟成雨TD18 小时前
Spring AI Alibaba 1.x 系列【49】状态图运行时引擎:CompiledGraph 源码解析
java·人工智能·spring
ADI_OP18 小时前
用SigmaStudio+软件来开发ADSP-21565
算法·音视频·adi dsp中文资料·adi音频dsp·adi dsp开发教程
城事漫游Molly18 小时前
研究设计核心 Toolkit:从“知道方法”到“真正会设计”
大数据·人工智能·算法·ai写作·论文笔记
Tutankaaa18 小时前
从10队到50队:知识竞赛软件的高并发场景如何设计?
java·经验分享·后端·spring
下次再写19 小时前
微服务架构实战:Spring Boot + Spring Cloud 从入门到精通
java·spring boot·spring cloud·微服务架构·服务注册与发现·分布式系统·api网关
bang冰冰19 小时前
Trae工具安装和使用教程(新手零基础入门,全程无坑)
java·人工智能·python
流年如夢19 小时前
单链表的应用 --> 简单通讯录的实现
android·数据结构·链表