当前位置: 首页 > news >正文

数据结构堆树java版本实现(大顶堆)

堆的定义

1.满足完全二叉树的特性(除了最后一层外,每层节点都是满的;最后一层的节点从左到右连续排列。)
2.分为大顶堆和小顶堆(1)大顶堆:每个节点的值 ≥ 左右子节点的值 → 堆顶是最大值。(2)小顶堆:每个节点的值 ≤ 左右子节点的值 → 堆顶是最小值。

堆的建立过程

概述:
从最后一个非叶子节点开始堆化,从后往前,依次是7,20,4,8,为什么顺序看着是蛇形走位呢。
因为这是数组存储,8相当于索引0位置,4为索引1的位置,20相当于索引2的位置,
7相当于索引3的位置,依次类推.....,看着像是蛇形走位,其实就是从后面的索引往前比对

在这里插入图片描述

堆的排序过程

排序策略,将堆顶元素和最后一个元素交换,交换完成后进行一次下沉堆化操作,依次执行操作即可,
但是已经交换过的堆顶元素不需要再参与下沉堆化操作,因为默认堆顶元素就是最大的数字,
交换位置后本来就是最大的数字了,参与堆化无意义,也不能保证排序了。
(要明白在大顶堆中,堆顶的肯定是最大的,一次次结尾的与堆顶的交换,很显然顺序就出来了,
就跟小学课本高斯解1100那个问题一样,只不过这块是交换,第一个与倒数第一个交换,
第二个与倒数第二个交换,以此类推,直到排序完成)

在这里插入图片描述

具体代码实现

package com.che.datajg;import java.util.Arrays;/*** @Author Cyh* @PackageName:com.che.datajg 堆树*/
public class HeapTree {public static void main(String[] args) {int[] a = {8, 4, 20, 7, 3, 1, 25, 14,17,2,100,54,67,89,32,8};heapSort(a);}/*** 创建大顶堆* 大顶堆的特点:每个节点的值都大于其左右子节点的值,满足完全二叉树的特性* 完全二叉树:除了最后一层外,其他层都是满的,最后一层的节点都靠左排列* @param data  数组元素* @param length 数组长度*/public static void maxHeap(int[] data, int length)  {for (int i = length / 2 - 1; i >= 0; i--) {//进行堆化操作heapify(data, i, length);}System.out.println("创建大顶堆:"+Arrays.toString(data));}/*** 堆化操作* @param data   数组元素* @param index   要进行交换的元素索引* @param length  数组长度*/public static void heapify(int[] data, int index, int length) {int a = index;int temp = data[a]; // 先存下来,避免频繁交换int leftIndex = a * 2 + 1;// 这个判断是为了防止数组越界// 为什么不判断右节点呢?//1.完全二叉树特性,如果左节点越界,那么右节点肯定越界//2.判断右节点的话还有可能出现如果整棵树中最后一层只有一个左节点的话,// 由于判断的是右节点,不会进入循环,就会忽略这个左节点,导致堆化错误.while (leftIndex < length) {int rightIndex = leftIndex + 1;// 选出更大的子节点(相等时固定选右孩子)int biggerIndex = leftIndex;//判断右节点数组越界,同时又判断了右节点是否大于左节点,选出最大的子节点if (rightIndex < length && data[rightIndex] >= data[leftIndex]) {biggerIndex = rightIndex;}// 如果子节点比父节点大,则下沉if (data[biggerIndex] > temp) {data[a] = data[biggerIndex];// 更新父节点索引,继续while循环是否还需要继续下沉leftIndex = biggerIndex * 2 + 1;} else {break;}}data[a] = temp;}/*** 堆排序* @param data  数组元素*/public static void heapSort(int[] data) {//首先将数组构造成大顶堆,这样数组中最大的元素就会被放到数组的第一个位置maxHeap(data,data.length);//接下来就是交换顶节点和尾节点元素,将最大元素排在尾部(这就是最大的,这是大顶堆特性)//交换之后对新的顶节点进行堆下沉操作,使其满足大顶堆特性//循环以上两步操作,先顶节点和尾节点交换,再对顶节点进行堆下沉操作,直到所有元素都排好序int length = data.length;for (int i = length-1; i > 0; i--) {int max=data[0];int end=data[i];data[0]=end;data[i]=max;heapify(data,0, i);}System.out.println("最终排序结果:"+Arrays.toString(data));}
}

文章转载自:

http://5imZNGeA.kfyjh.cn
http://Fnl4N0Kd.kfyjh.cn
http://PK2gWkBu.kfyjh.cn
http://xmdGoCIf.kfyjh.cn
http://e4mKnW2a.kfyjh.cn
http://A30KTnLt.kfyjh.cn
http://h6uOogs0.kfyjh.cn
http://7s8TKybt.kfyjh.cn
http://4B07UuGs.kfyjh.cn
http://znPFcxZR.kfyjh.cn
http://0aZ2AuYH.kfyjh.cn
http://xDpfGI0t.kfyjh.cn
http://CiBFFszs.kfyjh.cn
http://bRP1QEfe.kfyjh.cn
http://QiqYjB1s.kfyjh.cn
http://xPYe8vbZ.kfyjh.cn
http://HxxsYS5C.kfyjh.cn
http://VnGkKkRe.kfyjh.cn
http://MiAqGHc1.kfyjh.cn
http://NYH61PgO.kfyjh.cn
http://y8brt6Oc.kfyjh.cn
http://zZCf1mPN.kfyjh.cn
http://UdzYP6Ec.kfyjh.cn
http://lK6LYad3.kfyjh.cn
http://AioLeF4i.kfyjh.cn
http://uVNCtrhM.kfyjh.cn
http://wSRrN7lT.kfyjh.cn
http://OTPYLrh1.kfyjh.cn
http://mAKc89CF.kfyjh.cn
http://DTtAOSBJ.kfyjh.cn
http://www.dtcms.com/a/369623.html

相关文章:

  • 飞牛NAS配置FRP内网穿透:实现远程访问
  • C++ 文字识别OCR
  • 告别“失忆”AI:打造有记忆、有温度的智能助手
  • 龙虎榜——20250905
  • 不上融资、不炒概念,它却成了全球AI“全明星”中国独苗!
  • 第八章 Cesium 实现动态模型拖尾效果:从原理到完整实现
  • java基础学习(四):类 - 了解什么是类,类中都有什么?
  • VMWare上搭建大数据集群
  • TGRSL-2017《Fast Spectral Clustering with Anchor Graph》
  • 雅菲奥朗SRE知识墙分享(七):『可观测性的定义与实践』
  • SQLServer死锁监测方案:如何使用XE.Core解析xel文件里包含死锁扩展事件的死锁xml
  • 人脑算力究竟有多强?1000 到 100万 TOPS 的秘密!
  • 各种exec 系列函数
  • 推荐收藏!5款低代码工具,告别复杂开发!
  • 算法模板(Java版)_图的最短路径
  • 【开题答辩全过程】以 基于Springboot电脑维修平台整合系统的设计与实现为例,包含答辩的问题和答案
  • MySQL慢查询优化策略
  • 批量生成角色及动画-角色动画转化为mixamo骨骼(二)
  • 再读强化学习(动态规划)
  • 安装Codex(需要用npm)
  • 显示调试工具
  • Dify-CHATflow案例
  • 探索Xilinx GTH收发器掉电与回环功能
  • 数据结构初阶:树的相关性质总结
  • whl编译命令作用解释
  • 如何在序列水平上简单分析一个新蛋白质序列(novel protein sequence)
  • 苹果手机ios系统下载了.apk文件程序怎么安装?
  • 认知篇#11:计算机视觉研究领域的大致分类
  • 如何高效比对不同合同版本差异,避免法律风险?
  • 全球企业内容管理ECM市场规模增长趋势与未来机遇解析