package sunbufu.sort;
/**
* 堆排序
*
* 0
* 1 2
* 3 4 5 6
*
* 在二叉树中:
* 因为
* 根节点下标=左节点下标-1/2
* 根节点下标=右节点下标-2/2
* 所以
* 左节点下标=根节点下标*2+1
* 右节点下标=根节点下标*2+2
*
* @author 孙不服
*
*/
public class HeapSort {
public static void main(String[] args) {
HeapSort heapSort = new HeapSort();
int[] data = { 3, 5, 8, 9, 1, 2 };
heapSort.data = data;
heapSort.buildHeap();
for (int i = 0; i < data.length; i++) {
System.out.print(data[0] + ",");
data[0] = Integer.MAX_VALUE;
heapSort.buildHeap();
}
}
public int[] data;
/**
* 将数组转换成最小堆
*/
public void buildHeap() {
// 完全二叉树只有数组下标小于或等于 (data.length) / 2 - 1 的元素有孩子结点,遍历这些结点。
for (int i = (data.length) / 2 - 1; i >= 0; i--) {
// 对有孩子结点的元素heapify
heapify(i);
}
}
/**
* 让i元素下降到合适的位置
* @param i
*/
private void heapify(int i) {
// 获取左右结点的数组下标
int l = left(i);
int r = right(i);
// 这是一个临时变量,表示 根结点、左结点、右结点中最小的值的结点的下标
int smallest = i;
// 存在左结点,且左结点的值小于根结点的值
if (l < data.length && data[l] < data[i])
smallest = l;
// 存在右结点,且右结点的值小于以上比较的较小值
if (r < data.length && data[r] < data[smallest])
smallest = r;
// 左右结点的值都大于根节点,直接return,不做任何操作
if (i == smallest)
return;
// 交换根节点和左右结点中最小的那个值,把根节点的值替换下去
swap(i, smallest);
// 由于替换后左右子树会被影响,所以要对受影响的子树再进行heapify
heapify(smallest);
}
/**
* 获取根节点的左节点
* @param i
* @return
*/
private int left(int i) {
return i * 2 + 2;
}
/**
* 获取根节点的右节点
* @param i
* @return
*/
private int right(int i) {
return i * 2 + 1;
}
/**
* 交换数组下表为a跟b的位置
*
* @param a
* @param b
*/
public void swap(int a, int b) {
int temp = data[a];
data[a] = data[b];
data[b] = temp;
}
/**
* 打印堆
*/
public void printHeap() {
for (int i : data) {
System.out.print(i + ", ");
}
System.out.println();
}
}
相关推荐
二叉堆最小堆的Java实现
个人实现的最小权重的二叉堆实现,效率很高,适合任意场合下的临时列表排序。 可在外部写脚本对该文件进行测试 需要继承Tuple类实现排序对象类型,并实现Tuple的抽象方法weight()来反映排序对象权重
Java实现最小堆
堆,其实是一种优先队列,分为最大堆和最小堆。在最小堆中,它首先是一颗完全二叉树,并且根节点的值,要比左右孩子的值都要小,同时,左右子树也是最小堆。本文包含堆的操作如下: (1)插入一个节点 (2)删除堆顶元素,也就是删除最小值 (3)通过给定的一组数据,构建最小堆 由于用数组表示完全二叉树十分方便,所以本文采用的是数组存储数据。 1.准备 private int[] data; // 利用数组和完全二叉树的性质,存储数据 private int ...
知识图谱初步学习(一)——本体+Protege新手学习
文章目录前言(本体详解)1.本体概念2.本体分类3.本体组成4.本体构建方法一、protege简介二、软件使用步骤1.安装2.使用三、问题解决方案汇总 前言(本体详解) 在开始学习知识图谱的过程中,首先就是要了解什么是本体(ontology)。 1.本体概念 本体的概念最初源自于哲学领域,在哲学中的定义为“对世界上客观事物的系统描述,即存在论”。哲学中的本体关心的是客观现实的抽象本质。而在计算机领域,本体是可以在语义的层次上来对知识进行描述,可以看做是某一个领域知识的通用模型。 本体是从客观世界中抽象出来
优先队列的实现:基于最小堆的 Java 实现
优先队列是一种抽象数据类型,其中每个元素都有一个与之相关的优先级。在删除操作中,总是删除具有最高优先级的元素(对于最小堆来说是最小值)。优先队列的典型应用包括任务调度、图算法(如 Dijkstra 算法)等。
ABB机器人绝对精度实战:从焊接路径优化到TCP控制(附配置步骤)
本文深入探讨了ABB机器人绝对精度在焊接路径优化中的核心价值。通过对比重复定位精度,阐明绝对精度如何补偿机械误差,确保TCP在整个运动路径上的轨迹精度。文章提供了从示教器激活绝对精度功能的详细配置步骤,并分享了针对焊接抖动和实现0.2mm路径精度的进阶调优技巧,包括TCP标定、伺服参数优化与系统维护。
别再手动算临界转速了!用ANSYS Workbench 2023 R2快速搞定转子坎贝尔图(附完整APDL命令流)
本文详细介绍了如何利用ANSYS Workbench 2023 R2快速生成转子坎贝尔图,实现全自动临界转速分析。通过对比传统手动计算与Workbench自动化流程的效率差异,展示了其在旋转机械设计中的革命性优势,包括大幅缩短分析周期、提升精度至98.7%。文章还提供了完整的APDL命令流和实战案例,帮助工程师快速掌握这一高效工具。
python排序算法之(堆排序)
堆排序 堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序可以说是一种利用堆的概念来排序的选择排序。分为两种方法: 大顶堆:每个节点的值都大于或等于其子节点的值,在堆排序算法中用于升序排列; 小顶堆:每个节点的值都小于或等于其子节点的值,在堆排...
tkinter动态表格 - 实时更新数据(TkinterTable)
tkinter动态表格 - 实时更新数据(TkinterTable) 参考 [TkinterTable] Tkinter上的表格GUI】 https://github.com/dmnfarrell/tkintertable/wiki/Usage https://github.com/dmnfarrell/tkintertable/issues/47 python使用tkinter编写一个数据显示窗口(实时显示更新的数据) 首先安装TkinterTable,即pip install tki
java 最小堆_Java最小堆实现
package boke.heap1;/*** 堆结点** @since jdk1.5及其以上* @author 毛正吉* @version 1.0* @date 2010.05.24**/public class Node {private int iData; // 结点数据是整型public Node(int key) {iData = key;}/*** setKey** @param i...
win11重装系统简易教程-小白也可以上手!
本文介绍一下win11系统重装的各个步骤,也作为记录供自己后面查看。附上我之前参考的一位知乎大神写的重装win10系统文章的地址本文用到的工具全部是,不需要下载第三方镜像文件(不是说这个不好,只是第三方的软件或镜像文件网上非常多,琳琅满目,小白需要筛选甄别,直接用官方的就比较省心,大神请自便~)
SoIC、CoWoS、InFO一次讲透:从2D/2.5D/3D看懂先进封装
先进封装是后摩尔时代提升芯片性能的关键路径,但面对SoIC、CoWoS、InFO这些名词,很多人容易混淆。理解它们,需从最基本的2D、2.5D、3D封装概念入手:2D是传统平房,2.5D通过硅中介层实现高密度互连,3D则让芯片直接堆叠。CoWoS作为2.5D中介层封装,已成为AI芯片与HBM高带宽存储集成的行业标准;SoIC通过铜-铜混合键合实现真正的3D堆叠,为逻辑与缓存提供极致带宽;InFO以扇出型封装兼顾成本与集成度,广泛用于移动SoC。在系统级封装(SiP)和CPO共封装光学等前沿趋势中,这些技术往
图解最小堆形成(附带java实现代码)
最小(大)堆 最小(大)堆是一颗完全二叉树,该树中的某个节点的值总是不大于(不小于)其左右子节点的值。可以通过下图理解,另外,为什么会使用数组来保存呢?因为利用完全二叉树的性质,我们可以通过数组来表示完全二叉树(数组下标与完全二叉树节点存在映射关系,比如父节点可以通过Math.floor((index-1)/2)来获取),从而简化了实现及开销,避免使用额外的指针来实现树结构。 最小(大...
Saturn PCB Toolkit V8.02 实战:5分钟完成10A电源路径的走线与过孔通流验证
本文详细介绍了如何使用Saturn PCB Toolkit V8.02快速验证10A电源路径的走线与过孔通流能力。通过实战案例和参数配置指南,帮助工程师解决大电流PCB设计中的温升失控、过孔瓶颈等核心挑战,提升设计效率和可靠性。
java 最小堆_Java实现最小堆二
Java实现最小堆二如何建立这个堆呢,可以从空的堆开始,然后依次往堆中插入每一个元素,直到所有数都被插入。因为插入第N个元素的所用的时间是O(logN),所以插入所有元素的整体时间复杂度是O(NlogN),代码如下。n=0;for(i=1;i<=m;i++){n++;h[n]=a[i]; //或者写成scanf("%d",&h[n]);siftup();}其实我们还有更快得方法来建...
duilib入门基础一 容器之 BOX、VBOX、HBOX布局及其子控件align排列方式
序 容器 duilib有以下主要布局容器 Box(自由布局容器) VBox(垂直布局容器) HBox(水平布局容器) TabBox(多标签布局容器) TileBox(格子布局容器) ChildBox(子布局容器) ScrollableBox(可滚动容器) 一、Box容器布局 Box容器及其扩展VBox HBox是其中最常用的容器。 相对Box来说,HBox, VBox更好理解些 1.1 VBox HBox VBox下的各个控件垂...
计算机控制技术及应用
《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。
最小堆和最大堆的JAVA实现
/** * 文件名:BinaryHeap.java * 时间:2014年11月3日下午7:15:34 * 作者:修维康 */ package chapter6; import java.util.*; /** * 类名:BinaryHeap 说明:建立一个最小堆 */ class MinHeap> { private int currentSize; private stati
VC中sqlite的使用
在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示
最小堆java实现极其思想,最小堆的java实现
//从大牛那里转来的最小堆的动态添加与删除,以后好好看public class Node {/** * 堆结点 * 节点数据类型为:int */private int iDate;public Node(int iDate) {super();this.iDate = iDate;}public int getiDate() {return iDate;}public void setiDate(...
老版QQ原生表情gif动态
这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。
Java最小堆实现
package boke.heap1; /** * 堆结点 * * @since jdk1.5及其以上 * @author 毛正吉 * @version 1.0 * @date 2010.05.24 * */ public class Node { private int iData; // 结点数据是整型
最小堆--原理及JAVA实现
什么是堆最小堆是一种数据结构,有着如下特点:顺序:堆顶元素永远是最小的。形状:堆是一颗完全二叉树。这两个特性保证了堆在插入和删除的过程中最大时间复杂度也是满足O(logn)的,所以是一种非常高效的数据结构格式。更新堆的方式更新堆的两种方式,分别对应了插入元素和删除堆顶元素操作:自底向上自顶向下堆的实现可以使用数组作为隐式树(因为结构是完全二叉树),不使用索引为0的元素,从1开始。如果当前元素的下标...
最大堆、最小堆Java实现,解决TOP K问题
一、基础知识 1.1 什么是最大(小)堆 最大堆,最小堆类似,以下以最小堆为例进行讲解。 最小堆是满足以下条件的数据结构: 它是一棵完全二叉树 所有父节点的值小于或等于两个子节点的值 1.2 什么是完全二叉树 除了最后一层之外的其他每一层都被完全填充,并且所有结点都保持向左对齐。 1.3 什么是TOP K问题 Top K指的是从n(很大)个数据中,选取最大(小)的k个数据。例如学校要从全校学...
java实现堆_小根堆(最小堆)java实现,完整代码
贡献给有一定java基础的人,啥也不说了,直接上代码了。package org.index;import java.util.ArrayList;import java.util.List;import javax.sound.sampled.ReverbType;public class MinRoot {private Term5Num[] heapArray; // 堆容器private i...
java完全二叉树最小堆_Java实现最小堆一
Java实现最小堆一堆是一种经过排序的完全二叉树,其中任一非终端节点的数据值均不大于(或不小于)其左孩子和右孩子节点的值。最大堆和最小堆是二叉堆的两种形式。最大堆:根结点的键值是所有堆结点键值中最大者。最小堆:根结点的键值是所有堆结点键值中最小者。就像下面这棵树一样。 这棵二叉树有一个特点,就是所有父结点都比子结点要小(注意:圆圈里面的数是值,圆圈上面的数是这个结点的编号,此规定仅适用于本节)。符...
Java实现最小堆二
2019独角兽企业重金招聘Python工程师标准>>> ...
实现最小堆并进行堆排序(Java)
用java实现最小堆,并且实现以下2个题目: 实现堆排序 实现保留数据流中最大的5个数 代码如下: package trf; import java.util.Arrays; public class MinHeapTest { public static void main(String[] args) { System.out.println("第一题排序"); double[] a=new double[] {9.1,1.2,2.5,6,8,3}; MinHeap mh1=ne
Java实现最小堆一
2019独角兽企业重金招聘Python工程师标准>>> ...
3854



被折叠的 条评论
为什么被折叠?



