堆排序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,一经查实,立即删除!

相关文章

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

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

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跨…

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

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

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

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

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

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

Spring体系结构详解

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

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…

Spring目录结构和基础JAR包介绍

目前 Spring 框架的最新版本是 5.1.8&#xff0c;本教程是基于 Spring 的稳定版本 3.2.13 进行讲解的。读者可以通过网址 http://repo.spring.io/simple/libs-release-local/org/springframework/spring/ 下载名称为 springframework-3.2.13.RELEASE-dist.zip 的压缩包。单击此…

自定义依赖注解无效_SpringValidation用注解代替代码参数校验解析

Spring Validation概念在原先的编码中&#xff0c;我们如果要验证前端传递的参数&#xff0c;一般是在接受到传递过来的参数后&#xff0c;手动在代码中做 if-else 判断&#xff0c;这种编码方式会带来大量冗余代码&#xff0c;十分的不优雅。因此&#xff0c;推出了用注解的方…

mysql开源许可_为什么开源数据库改变许可证?

CockroachDB 是一个开源的分布式数据库&#xff0c;最近改变了代码授权&#xff0c;放弃了 Apache 许可证。一、CockroachDB 的许可证变更CockroachDB 以前的许可证是 Apache&#xff0c;代码托管在 GitHub&#xff0c;任何人都可以访问。现在的许可证改成了"商业源码许可…

Spring 依赖注入的实现

依赖注入&#xff08;Dependency Injection&#xff0c;DI&#xff09;和控制反转含义相同&#xff0c;它们是从两个角度描述的同一个概念。 当某个 Java 实例需要另一个 Java 实例时&#xff0c;传统的方法是由调用者创建被调用者的实例&#xff08;例如&#xff0c;使用 new…

java 静态对象语法_04.Java 语法

计算机基础知识表达式(expression)&#xff1a;Java中最基本的一个运算。比如一个加法运算表达式。12是一个表达式&#xff0c;ab也是。计算机内存的最小存储单元是字节(byte)&#xff0c;一个字节就是一个8位二进制数&#xff0c;即8个bit。它的二进制表示范围从00000000~1111…

Spring实例化Bean

在面向对象的程序中&#xff0c;要想调用某个类的成员方法&#xff0c;就需要先实例化该类的对象。在 Spring 中&#xff0c;实例化 Bean 有三种方式&#xff0c;分别是构造器实例化、静态工厂方式实例化和实例工厂方式实例化。 构造器实例化 构造器实例化是指 Spring 容器通…

Spring基于XML装配Bean

Bean 的装配可以理解为依赖关系注入&#xff0c;Bean 的装配方式也就是 Bean 的依赖注入方式。Spring 容器支持多种形式的 Bean 的装配方式&#xff0c;如基于 XML 的 Bean 装配、基于 Annotation 的 Bean 装配和自动装配等。 Spring 基于 XML 的装配通常采用两种实现方式&…

苹果php环境,苹果电脑安装PHP环境步骤-PHP问题

苹果电脑装置PHP环境步骤&#xff1a;一、起首咱们需求装置Homebrew二、终端输出饬令// 创立目次,假如你不创立过该目次sudo mkdir /usr/local/varsudo chmod 777 /usr/local/var//修正成你本人的用户名以及组,假如你不创立过该目次sudo mkdir /usr/local/sbin/sudo chown -R :…

Spring基于Annotation装配Bean

在 Spring 中&#xff0c;尽管使用 XML 配置文件可以实现 Bean 的装配工作&#xff0c;但如果应用中 Bean 的数量较多&#xff0c;会导致 XML 配置文件过于臃肿&#xff0c;从而给维护和升级带来一定的困难。 Java 从 JDK 5.0 以后&#xff0c;提供了 Annotation&#xff08;注…

swiper鼠标hover停止自动轮播_swiper滑块组件

相信大家在平常购物的时候都会看到轮播图&#xff0c;轮播图里面播放的是热门商品的信息。在小程序里面我们可以通过swiper滑动视图容器组件来实现&#xff0c;让我们一起来看下swiper组件都有哪些属性&#xff1a;我们看到可以通过一些属性给视图容器增加一些指示点&#xff0…

Spring自动装配Bean

除了使用 XML 和 Annotation 的方式装配 Bean 以外&#xff0c;还有一种常用的装配方式——自动装配。自动装配就是指 Spring 容器可以自动装配&#xff08;autowire&#xff09;相互协作的 Bean 之间的关联关系&#xff0c;将一个 Bean 注入其他 Bean 的 Property 中。 要使用…

java鬼剑士觉醒,DNF新觉醒装扮,男鬼剑士帅气无比!

在DNF这个游戏中&#xff0c;时装作为游戏的一大氪点&#xff0c;相信这几天的奇迹缝纫机活动也让大家了解到了时装到底多么的烧钱&#xff01;而也因为这次的活动&#xff0c;时装可以说达到了饱和状态了&#xff0c;估计短时间之内魔盒里不会再出现追忆时装了&#xff01;虽然…

Spring JDK动态代理

JDK 动态代理是通过 JDK 中的 java.lang.reflect.Proxy 类实现的。下面通过具体的案例演示 JDK 动态代理的使用。 1. 创建项目 在 MyEclipse 中创建一个名称为 spring 的 Web 项目&#xff0c;将 Spring 支持和依赖的 JAR 包复制到 Web 项目的 WEB-INF/lib 目录中&#xff0c;…