Java 堆排序详解
1.堆排序:所谓的堆排序就是一个类似完全二叉树,其左孩子为 2*i+1,右孩子为2*i+2,父节点为(i-1)/2,如果不懂这个公式的话可以推演一下很快就能推出来,注意这里是取整的。
堆分为最大堆和最小堆,最大堆的任意子树根节点不小于任意子结点,最小堆的根节点不大于任意子结点。所谓堆排序就是利用堆这种数据结构来对数组排序,我们使用的是最大堆。处理的思想和冒泡排序,选择排序非常的类似,一层层封顶,只是最大元素的选取使用了最大堆。最大堆的最大元素一定在第0位置,构建好堆之后,交换0位置元素与顶即可。堆排序为原位排序(空间小), 且最坏运行时间是O(nlgn),是渐进最优的比较排序算法。
堆排序的大概步骤如下:
- 构建最大堆。
- 选择顶,并与第0位置元素交换
- 由于步骤2的的交换可能破环了最大堆的性质,第0不再是最大元素,需要调用maxHeap调整堆(沉降法),如果需要重复步骤2
堆排序中最重要的算法就是maxHeap,该函数假设一个元素的两个子节点都满足最大堆的性质(左右子树都是最大堆),只有跟元素可能违反最大堆性质,那么把该元素以及左右子节点的最大元素找出来,如果该元素已经最大,那么整棵树都是最大堆,程序退出,否则交换跟元素与最大元素的位置,继续调用maxHeap原最大元素所在的子树。该算法是分治法的典型应用。具体代码如下:
public static void swap(int[] array,int x,int y) {int temp = array[x];array[x] = array[y];array[y] = temp;}
public static void minHead(int[] a,int length,int index) {int left = 2*index +1;int right =2*index +2;int minindex =index;if (left<length && a[left]<a[minindex]) {minindex =left;}if (right<length &&a[right]<a[minindex]) {minindex =right;}if (index != minindex) {swap(a, index,minindex );minHead(a, length, minindex); }}
public static void createHead(int[]a) { int parent = (a.length)/2;//父节点for(int i =parent ;i>=0;i--) {minHead(a, a.length, i);//建立最小堆}}
public static void HeadSort(int[] a) {if (a ==null|| a.length<=1) {//判断数组return;} createHead(a);//建堆for (int i = a.length-1; i >= 1; i--) {//循环遍历每个数,从最底层遍历并交换数据,之后看最小堆是否成立swap(a, 0, i);minHead(a, i, 0);}}
测试:
int[] a = new int[] {50,100,6,3,2,1,5,-5,6,8};//quickSort(a,0,a.length-1);HeadSort(a);for (int i = 0; i < a.length; i++) {System.out.print(a[i] +" ");}
如果是最大堆的话只需要改一下minHead函数的判断条件。
Java 堆排序详解相关推荐
- Apache Thrift - java开发详解
2019独角兽企业重金招聘Python工程师标准>>> Apache Thrift - java开发详解 博客分类: java 架构 中间件 1.添加依赖 jar <depen ...
- Java泛型详解-史上讲解最详细的,没有之一
目录 1. 概述 2. 一个栗子 3. 特性 4. 泛型的使用 4.1 泛型类 4.2 泛型接口 4.3 泛型通配符 4.4 泛型方法 4.4.1 泛型方法的基本用法 4.4.2 类中的泛型方法 4. ...
- Java虚拟机详解----JVM常见问题总结
[正文] 声明:本文只是做一个总结,有关jvm的详细知识可以参考本人之前的系列文章,尤其是那篇:Java虚拟机详解04----GC算法和种类.那篇文章和本文是面试时的重点. 面试必问关键词:JVM垃圾 ...
- java 泛型详解、Java中的泛型方法、 java泛型详解
本文参考java 泛型详解.Java中的泛型方法. java泛型详解 概述 泛型在java中有很重要的地位,在面向对象编程及各种设计模式中有非常广泛的应用. 什么是泛型?为什么要使用泛型? 泛型,即& ...
- 最详细的java泛型详解
来源:最详细的java泛型详解 对java的泛型特性的了解仅限于表面的浅浅一层,直到在学习设计模式时发现有不了解的用法,才想起详细的记录一下. 本文参考java 泛型详解.Java中的泛型方法. ja ...
- Java异常详解及如何处理
来源:Java异常详解及如何处理 简介 程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常.异常发生时,是任程序自生自灭,立刻退出终止,还是输出错误给用户?或者用C语言 ...
- Java基础——Java NIO详解(一)
一.基本概念 1.I/0简介 I/O即输入输出,是计算机与外界世界的一个借口.IO操作的实际主题是操作系统.在java编程中,一般使用流的方式来处理IO,所有的IO都被视作是单个字节的移动,通过str ...
- Java基础——Java NIO详解(二)
一.简介 在我的上一篇文章Java NIO详解(一)中介绍了关于标准输入输出NIO相关知识, 本篇将重点介绍基于网络编程NIO(异步IO). 二.异步IO 异步 I/O 是一种没有阻塞地读写数据的方法 ...
- Java基础——Java IO详解
一.概述 1.Java IO Java IO即Java 输入输出系统.不管我们编写何种应用,都难免和各种输入输出相关的媒介打交道,其实和媒介进行IO的过程是十分复杂的,这要考虑的因素特别多,比如我们要 ...
最新文章
- HTML4 和 HTML5 的10个关键区别
- 山东省第三届数据应用赛事来了!
- 动手学深度学习(二)
- python截取数组的一半_python:28.数组中出现次数超过一半的数字
- Windows环境下利用VS和mingw编译LLVM
- Vue本地执行build之后打开dist目录下index.html正常访问
- 【IT资讯】TIOBE - 2020年7月编程语言排行
- 手机qq和电脑qq怎么同步消息_手机QQ接入华为HMS!停止运行也能接收消息
- 想了解表格问答,我们先看看TA的前世
- 关于csv文件转化为张量
- 一周工作所用的日常 Git 命令
- js 事件模型 + ( 事件类型 )
- 高等数学(第七版)同济大学 习题1-8 个人解答
- VMware虚拟机丨VMware11虚拟机软件下载+安装教程
- 安全模式解除android,安卓手机进入安全模式之后怎么解除
- linux之awk基础
- 设计模式在美团外卖营销业务中的实践
- js创建节点及节点操作
- 一对多的临近服务直接通信
- 10分钟学会汇编语言的寻址方式
热门文章
- 双链表冒泡排序c语言,从数组冒泡排序迁移到链表冒泡排序(示例代码)
- linux原生迅雷文本模式,ubuntu 下运行原生的迅雷
- 怎么在PPT2010中添加动作按钮
- 【Pytorch】 repeat()的用法详解
- 第一个C语言程序,visual C++ 6.0使用教程
- CTR预估系列(一)-FNN论文笔记
- 计算机网络 逻辑地址,逻辑地址
- 宏基计算机两个DP接口,宏碁R7有什么接口?宏碁R7有几个USB接口?
- 【大数据基础】2020年美国新冠肺炎疫情数据分析
- mysql表设计 不同价格_电商网站商品详情页,要能选择商品属情如大小,颜色,型号等,对应不同价格,数据库应该如何设计?...