1.堆排序:所谓的堆排序就是一个类似完全二叉树,其左孩子为 2*i+1,右孩子为2*i+2,父节点为(i-1)/2,如果不懂这个公式的话可以推演一下很快就能推出来,注意这里是取整的。

堆分为最大堆和最小堆,最大堆的任意子树根节点不小于任意子结点,最小堆的根节点不大于任意子结点。所谓堆排序就是利用堆这种数据结构来对数组排序,我们使用的是最大堆。处理的思想和冒泡排序,选择排序非常的类似,一层层封顶,只是最大元素的选取使用了最大堆。最大堆的最大元素一定在第0位置,构建好堆之后,交换0位置元素与顶即可。堆排序为原位排序(空间小), 且最坏运行时间是O(nlgn),是渐进最优的比较排序算法。

堆排序的大概步骤如下:

  1. 构建最大堆。
  2. 选择顶,并与第0位置元素交换
  3. 由于步骤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 堆排序详解相关推荐

  1. Apache Thrift - java开发详解

    2019独角兽企业重金招聘Python工程师标准>>> Apache Thrift - java开发详解 博客分类: java 架构 中间件 1.添加依赖 jar <depen ...

  2. Java泛型详解-史上讲解最详细的,没有之一

    目录 1. 概述 2. 一个栗子 3. 特性 4. 泛型的使用 4.1 泛型类 4.2 泛型接口 4.3 泛型通配符 4.4 泛型方法 4.4.1 泛型方法的基本用法 4.4.2 类中的泛型方法 4. ...

  3. Java虚拟机详解----JVM常见问题总结

    [正文] 声明:本文只是做一个总结,有关jvm的详细知识可以参考本人之前的系列文章,尤其是那篇:Java虚拟机详解04----GC算法和种类.那篇文章和本文是面试时的重点. 面试必问关键词:JVM垃圾 ...

  4. java 泛型详解、Java中的泛型方法、 java泛型详解

    本文参考java 泛型详解.Java中的泛型方法. java泛型详解 概述 泛型在java中有很重要的地位,在面向对象编程及各种设计模式中有非常广泛的应用. 什么是泛型?为什么要使用泛型? 泛型,即& ...

  5. 最详细的java泛型详解

    来源:最详细的java泛型详解 对java的泛型特性的了解仅限于表面的浅浅一层,直到在学习设计模式时发现有不了解的用法,才想起详细的记录一下. 本文参考java 泛型详解.Java中的泛型方法. ja ...

  6. Java异常详解及如何处理

    来源:Java异常详解及如何处理 简介 程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常.异常发生时,是任程序自生自灭,立刻退出终止,还是输出错误给用户?或者用C语言 ...

  7. Java基础——Java NIO详解(一)

    一.基本概念 1.I/0简介 I/O即输入输出,是计算机与外界世界的一个借口.IO操作的实际主题是操作系统.在java编程中,一般使用流的方式来处理IO,所有的IO都被视作是单个字节的移动,通过str ...

  8. Java基础——Java NIO详解(二)

    一.简介 在我的上一篇文章Java NIO详解(一)中介绍了关于标准输入输出NIO相关知识, 本篇将重点介绍基于网络编程NIO(异步IO). 二.异步IO 异步 I/O 是一种没有阻塞地读写数据的方法 ...

  9. Java基础——Java IO详解

    一.概述 1.Java IO Java IO即Java 输入输出系统.不管我们编写何种应用,都难免和各种输入输出相关的媒介打交道,其实和媒介进行IO的过程是十分复杂的,这要考虑的因素特别多,比如我们要 ...

最新文章

  1. HTML4 和 HTML5 的10个关键区别
  2. 山东省第三届数据应用赛事来了!
  3. 动手学深度学习(二)
  4. python截取数组的一半_python:28.数组中出现次数超过一半的数字
  5. Windows环境下利用VS和mingw编译LLVM
  6. Vue本地执行build之后打开dist目录下index.html正常访问
  7. 【IT资讯】TIOBE - 2020年7月编程语言排行
  8. 手机qq和电脑qq怎么同步消息_手机QQ接入华为HMS!停止运行也能接收消息
  9. 想了解表格问答,我们先看看TA的前世
  10. 关于csv文件转化为张量
  11. 一周工作所用的日常 Git 命令
  12. js 事件模型 + ( 事件类型 )
  13. 高等数学(第七版)同济大学 习题1-8 个人解答
  14. VMware虚拟机丨VMware11虚拟机软件下载+安装教程
  15. 安全模式解除android,安卓手机进入安全模式之后怎么解除
  16. linux之awk基础
  17. 设计模式在美团外卖营销业务中的实践
  18. js创建节点及节点操作
  19. 一对多的临近服务直接通信
  20. 10分钟学会汇编语言的寻址方式

热门文章

  1. 双链表冒泡排序c语言,从数组冒泡排序迁移到链表冒泡排序(示例代码)
  2. linux原生迅雷文本模式,ubuntu 下运行原生的迅雷
  3. 怎么在PPT2010中添加动作按钮
  4. 【Pytorch】 repeat()的用法详解
  5. 第一个C语言程序,visual C++ 6.0使用教程
  6. CTR预估系列(一)-FNN论文笔记
  7. 计算机网络 逻辑地址,逻辑地址
  8. 宏基计算机两个DP接口,宏碁R7有什么接口?宏碁R7有几个USB接口?
  9. 【大数据基础】2020年美国新冠肺炎疫情数据分析
  10. mysql表设计 不同价格_电商网站商品详情页,要能选择商品属情如大小,颜色,型号等,对应不同价格,数据库应该如何设计?...