堆排序java实例_堆排序(示例代码)

前言:网上有很多堆排序的案例,我只想写自己堆排序。

一:堆结构

即:一个父节点最多只能有两个子节点(可以没有),如下图

图1

20190227130457829303.png       图2

20190227130457925987.png          图3

20190227130457975793.png      图4

20190227130458024623.png

二: 数组与堆结构转换

假设已知堆数组   int[]  a = {9,7,6,4,5,1,3,2,}  则相应对结构如下

20190227130458077360.png

图5

备注: 一个父节点(pNode  为图5中的7 )和两个子节点(4(lNOde 左节点)和5(rNode 右节点))的关系

左节点: lNOde =  2*pNode   + 1  ;

右节点 :  rNode  = 2*pNode    +2 ;

三:通过已知数组建立成堆结构数组

假设已知数组   int[] a = { 7,9,6,4,5,1,3,2};

思路:对一个已知堆结构数组(长度为n)中添加一个元素,并调整该结果使之成为新的堆结构数组(长度变成 n+1)

步骤一:获取该数组的第一个元素 7 (a[0])为已知堆数组。

步骤二 :获取该数组的第下一个元素9(a[1])并添加到上一个堆结构数组中,并判断其的父节点是否大于自己,如果大于则交换父节点与自己的位置,交换后自己就在父节点的位置并把自己当成新的子节点,继续寻找父节点直至自己小于父节点并返回。如果大于则已是堆结构返回。以此类推直至成为新的堆结构。

步骤三 :重复步骤二,直至数组最后一个元素。

java实现:

/*** 建立堆模型

*

*@parama*/

private static void buildHeat(int[] a) {for (int i = 1; i < a.length; i++) { //注意我是从数组的第二个位置(即 index = 1)开始的int parentNodeIndex =getParentNodeIndex(i);int currentIndex =i;while (parentNodeIndex >= 0) {//判断子节点是否大于父节点

if (a[parentNodeIndex]

int temp =a[parentNodeIndex];

a[parentNodeIndex]=a[currentIndex];

a[currentIndex]=temp;

}else{// break; //步骤2 :自己小于父节点结束循环(while)已成为新的堆结构。>>>>>>>执行步骤3

}

currentIndex=parentNodeIndex; //步骤2 把自己当成新的子节点

parentNodeIndex=getParentNodeIndex(parentNodeIndex);

}

}

}

四:去堆(获取排序)

步骤一:因为堆顶是整个堆结构中最大的数,所以我获取堆顶的哪个数9(a[0]  如图5),并把堆中最后一个数2(如图5)放入堆顶 (此时的数组长度是原来数组长度的减一)

步骤二 :调整堆结构(因为上一个步骤把 最后一个数放入如堆顶).。

调整方法:   获取获取左右子节点,先判断是否有子节点,然后判断两个子节点的大小(假设9已经换成了2,当前它有两个子节点,7(左子节点) 6 (右子节点)),获取到最大的子节点(7),并于父节点(2)比较 ,如果子节点大于父节点,交换父节点与子节点的位置,并把当前自己成为新的父节点重复调整方法,直至没有子节点或父节点大于所有子节点。成为新的堆结构

步骤三 :重复步骤一和二 ,直至没有改结构中没有子节点。

java实现

备注:代码与步骤二的调整方法有些不同 ,因为 1)如果没有左节点 (调整结束) 就一定不会有右节点?。2)如果有右节点就一定有左节点?。3)如果只有左节点没有右节点?

//去除堆 》》即排序

for(int j = 0; j < a.length; j++) {int lastIndex = a.length - 1 -j;int currentIndex = 0;int temp2 = a[0]; //步骤1 : 获取堆结构中的最大数 并与最后一个数交换位置

a[0] =a[lastIndex];

a[lastIndex]=temp2;while(true) {//获取左节点

int leftChildNodeIndex =getLeftChildNodeIndex(currentIndex); //步骤2 获取左节点位置if(leftChildNodeIndex >=lastIndex) { //判断做节点是否有 有数//没有左节点子节点 即去堆完成

for (int i = 0; i < a.length ; i++) {

System.out.print(a[i]+ ",");

}

System.out.println("没有左节点子节点 即去堆完成");break; //步骤3

}//获取右节点

int rightChildNodeIndex =getRightChildNodeIndex(currentIndex);if(rightChildNodeIndex >=lastIndex) { //获取右节点//没有右子节点 但有左节点 需要进行 交换

if (a[leftChildNodeIndex] >a[currentIndex]) {//判断左子节点 大于父节点 需要交换位置

int temp =a[leftChildNodeIndex];

a[leftChildNodeIndex]=a[currentIndex];

a[currentIndex]=temp;

}for (int i = 0; i < a.length ; i++) {

System.out.print(a[i]+ ",");

}

System.out.println("没有右子节点 但有左节点");break; //步骤3

}//即有左节点又有有节点//先判断左右节点的大小 返回大节点

int whichIndexBig = a[leftChildNodeIndex] > a[rightChildNodeIndex] ?leftChildNodeIndex : rightChildNodeIndex;//判断子节点是否大于符节点

if (a[whichIndexBig] >a[currentIndex]) {//子节点大于父节点 需要交换子父节点的位置

int temp =a[whichIndexBig];

a[whichIndexBig]=a[currentIndex];

a[currentIndex]=temp;

}//当前父节点

currentIndex =whichIndexBig; //

}

}

五 完整代码实现如下

jia.gif

jian.gif

packagecom.jinliang.sort;public classHeatSort {public static voidmain(String[] args) {int[] a = { 7,4,6,9,5,1,3,2};//创建堆数组

buildHeat(a);for (int j = 0; j < a.length; j++) {

System.out.print(a[j]+ ",");

}

System.out.println("建队完成");//int[] a = {42, 88, 77, 76, 66, 55, 64, 52, 45, 54, 34, 2, 32, 12, 35, 1, 22, 21, 34, 3};//去除堆 》》即排序

for(int j = 0; j < a.length; j++) {int lastIndex = a.length - 1 -j;int currentIndex = 0;int temp2 = a[0];

a[0] =a[lastIndex];

a[lastIndex]=temp2;while(true) {//获取左节点

int leftChildNodeIndex =getLeftChildNodeIndex(currentIndex);if(leftChildNodeIndex >=lastIndex) {//没有左节点子节点 即去堆完成

for (int i = 0; i < a.length ; i++) {

System.out.print(a[i]+ ",");

}

System.out.println("没有左节点子节点 即去堆完成");break;

}//获取右节点

int rightChildNodeIndex =getRightChildNodeIndex(currentIndex);if(rightChildNodeIndex >=lastIndex) {//没有右子节点 但有左节点 需要进行 交换

if (a[leftChildNodeIndex] >a[currentIndex]) {//判断左子节点 大于父节点 需要交换位置

int temp =a[leftChildNodeIndex];

a[leftChildNodeIndex]=a[currentIndex];

a[currentIndex]=temp;

}for (int i = 0; i < a.length ; i++) {

System.out.print(a[i]+ ",");

}

System.out.println("没有右子节点 但有左节点");break;

}//即有左节点又有有节点//先判断左右节点的大小 返回大节点

int whichIndexBig = a[leftChildNodeIndex] > a[rightChildNodeIndex] ?leftChildNodeIndex : rightChildNodeIndex;//判断子节点是否大于符节点

if (a[whichIndexBig] >a[currentIndex]) {//子节点大于父节点 需要交换子父节点的位置

int temp =a[whichIndexBig];

a[whichIndexBig]=a[currentIndex];

a[currentIndex]=temp;

}//当前父节点

currentIndex =whichIndexBig;

}

}//输出排序后的数组

for (int i = 0; i < a.length; i++) {

System.err.print(a[i]+ ",");

}

}/*** 建立堆模型

*

*@parama*/

private static void buildHeat(int[] a) {for (int i = 1; i < a.length; i++) {int parentNodeIndex =getParentNodeIndex(i);int currentIndex =i;while (parentNodeIndex >= 0) {//判断子节点是否大于父节点

if (a[parentNodeIndex]

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

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

相关文章

C++变量位置

C 在C语言部分做了细节上的改进&#xff0c;变量的定义位置就是其中之一。 请看下面的代码&#xff1a; #include <stdio.h> int main(){int a;scanf("%d", &a);int b;scanf("%d", &b);int c a b;printf("%d\n", c);return 0;…

java source folder作用_java项目把源码放到folder里,不是source folder,这个java代码还能被调用吗?...

看到这个问题&#xff0c;真心觉得初学入门就用IDE真心不是一个好方法。IDE屏蔽了太多基础知识&#xff0c;比如Java是需要编译的&#xff0c;运行的是编译后的class文件。编译命令有编译参数&#xff0c;执行命令有执行命令的参数。还有环境变量&#xff0c;classpath等。由于…

python 生成图片_python生成带有表格的图片

因为工作中需要&#xff0c;需要生成一个带表格的图片例如&#xff1a;直接在html中写一个table标签&#xff0c;然后单独把表格部分保存成图片或者是直接将excel中的内容保存成一个图片刚开始的思路&#xff0c;是直接生成一个带有table标签的html文件&#xff0c;然后将这个文…

C++布尔类型

C语言中&#xff0c;关系运算和逻辑运算的结果有两种&#xff0c;真和假&#xff1a;0 表示假&#xff0c;非 0 表示真。例如&#xff1a; #include <stdio.h> int main(){int a, b, flag;scanf("%d %d", &a, &b);flag a > b; //flag保存关系运算…

wpf xaml突然不能自动补齐代码_Xaml+C#桌面客户端跨平台初体验

(给DotNet加星标&#xff0c;提升.Net技能)转自&#xff1a;大头BigHeadcnblogs.com/Big-Head/p/12614118.html前言随着 .NET 5的到来&#xff0c;微软在 .NET跨平台路上又开始了一个更高的起点。回顾.NET Core近几年的成果&#xff0c;可谓是让.NET重生了一次.ASP .NET Core跨…

java实现日期让随动变_java工具类(四)之实现日期随意跳转

Java实现日期随意跳转项目开发过程中。须要进行订单提醒日期的设置。主要包含设置每月指定的日期或者指定的天数&#xff0c;代码例如以下&#xff1a;public static String DateOperation(String type, Date myDate, int num) {String date null;SimpleDateFormat formatter …

python继承和多态_Python 简明教程 --- 21,Python 继承与多态

程序不是年轻的专利&#xff0c;但是&#xff0c;它属于年轻。目录我们已经知道封装&#xff0c;继承和多态 是面向对象的三大特征&#xff0c;面向对象语言都会提供这些机制。1&#xff0c;封装在这一节介绍类的私有属性和方法的时候&#xff0c;我们已经讲到过封装。封装就是…

C++ new和delete运算符

C语言中&#xff0c;动态分配内存用 malloc() 函数&#xff0c;释放内存用 free() 函数。如下所示&#xff1a; int *p (int*) malloc( sizeof(int) * 10 ); //分配10个int型的内存空间 free(p); //释放内存在C中&#xff0c;这两个函数仍然可以使用&#xff0c;但是C又新增…

计划任务如何使用 java_java – 如何计划任务以定期间隔运行?

使用timer.scheduleAtFixedRatevoid java.util.Timer.scheduleAtFixedRate(TimerTask task, long delay, long period)scheduleAtFixedRatepublic void scheduleAtFixedRate(TimerTask task,long delay,long period)在指定的延迟后开始&#xff0c;为指定的任务调度重复的固定速…

C++ inline内联函数详解

函数是一个可以重复使用的代码块&#xff0c;CPU 会一条一条地挨着执行其中的代码。CPU 在执行主调函数代码时如果遇到了被调函数&#xff0c;主调函数就会暂停&#xff0c;CPU 转而执行被调函数的代码&#xff1b;被调函数执行完毕后再返回到主调函数&#xff0c;主调函数根据…

vc6.0mfc中单选按钮如何分组_按钮系列02-搞定按钮和选框的14个秘诀

UI 界面当中&#xff0c;各种开关、按钮、选框控件是非常常见的组件&#xff0c;它们看起来不复杂&#xff0c;但是在实际使用的时候讲究非常之多&#xff0c;它们不仅关乎体验&#xff0c;而且涉及到一些界面逻辑问题。英文中的 「Toggle」一词&#xff0c;对应的是带有短柄的…

C++函数的默认参数

在C中&#xff0c;定义函数时可以给形参指定一个默认的值&#xff0c;这样调用函数时如果没有给这个形参赋值&#xff08;没有对应的实参&#xff09;&#xff0c;那么就使用这个默认的值。也就是说&#xff0c;调用函数时可以省略有默认值的参数。如果用户指定了参数的值&…

python复制文件夹不阻塞_python学习笔记-(十四)I/O多路复用 阻塞、非阻塞、同步、异步...

1. 概念说明1.1 用户空间与内核空间现在操作系统都是采用虚拟存储器&#xff0c;那么对32位操作系统而言&#xff0c;它的寻址空间(虚拟存储空间)为4G(2的32次方)。操作系统的核心是内核&#xff0c;独立于普通的应用程序&#xff0c;可以访问受保护的内存空间&#xff0c;也有…

java某个类避免findbug检查_Findbug插件静态java代码扫描工具使用

本文转自http://blog.csdn.net/gaofuqi/article/details/22679609 感谢作者FindBugs 是由马里兰大学提供的一款开源 Java静态代码分析工具。FindBugs通过检查类文件或 JAR文件&#xff0c;将字节码与一组缺陷模式进行对比从而发现代码缺陷&#xff0c;完成静态代码分析。FindBu…

Spring 是什么

Spring 是一个主流的 Java Web 开发框架&#xff0c;该框架是一个轻量级的应用框架&#xff0c;具有很高的凝聚力和吸引力。 Spring 是分层的 Java SE/EE full-stack 轻量级开源框架&#xff0c;以 IoC&#xff08;Inverse of Control&#xff0c;控制反转&#xff09;和 AOP&…

4乘4方格走的路线_苏州周边4个冷门自驾游路线景点推荐

1.崇明东滩崇明东滩湿地公园有两大看点&#xff0c;一是看候鸟迁徙&#xff0c;二是看日出和星空。东滩湿地滩涂辽阔&#xff0c;低头是大片的芦苇&#xff0c;抬头是满天斑斓的云彩&#xff0c;顺着木栈道走在公园内&#xff0c;如与大自然融为一体&#xff0c;可360度将美景收…

matlab程序转java_用面向对象的方法将一段JAVA代码转化为matlab

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼public class Variable {/*list of variables this variable is connected to. */ Vector neighbors;/* id of this variable */public int varID;/* id of agent this variable belongs to. */public int agentID;/** The domain …

Spring体系结构详解

Spring 框架采用分层架构&#xff0c;根据不同的功能被划分成了多个模块&#xff0c;这些模块大体可分为 Data Access/Integration、Web、AOP、Aspects、Messaging、Instrumentation、Core Container 和 Test。 Spring的体系结构如下图所示 图中包含了 Spring 框架的所有模块…

python时间戳是什么意思_Python-时间戳

# import time# 返回时间戳# print(time.time()) #返回时间戳# print(time.gmtime()) #返回utc时间戳# print(time.localtime(time.time()-86400)) #返回当地的时间戳# print(time.strftime("%Y-%m-%d",time.localtime())) #将struct_time转为字符串# print(time.mkt…

java对外查询接口注意的地方_Java接口注意点

1、接口可以多实现&#xff1a;一个实现类可以同时实现多个接口package com.qf.demo02_interface;//定义一种规则&#xff1a;interface A{public void testA();//public void fun();}//定义另一种规则interface B{public void testB();public void fun();}//实现类&#xff0c…