1、堆排序基本介绍

1)堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。
2)堆是具有以下性质的完全二叉树,每个节点的值都大于或者等于其左右孩子节点的值,称为大顶堆,并没有要求结点的左孩子的值和右孩子的值的大小关系。
3)每个节点的值都小于或等于其左右孩子节点的值,称为小顶堆。
4)大顶堆举例:

5)小顶堆举例:

一般升序采用大顶堆,降序采用小顶堆

2、堆排序基本思想

1)将待排序序列构造成一个大顶堆
2)此时,整个序列的最大值就是堆顶的根节点。
3)将其与末尾元素进行交换,此时末尾就为最大值。
4)然后将剩余n-1个元素重新构造成一个堆,这样会得到n个元素的次小值。如此反复执行,使能得到一个有序序列了。
在构建大顶堆的过程中,元素的个数逐渐减少

3、堆排序图解

步骤一:构造初始堆。将给定无序序列构造成一个大顶堆(一般升序采用大顶堆,降序采用小顶堆)

1)、初始数组 [4,6,8,5,9]

2)此时我们从最后一个非叶子节点开始(叶子节点不用调整,第一个非叶子节点arr.length/2-1 = 1,也就是下面的6节点),从左至右,从下至上进行调整。

3)、找到第二个非叶子节点4,由于[4,8,9]中9最大,4和9交换

4)这时,交换导致了子根[4,5,6]结构混乱,继续调整,[4,5,6]中6最大,交换4和6。

此时我们就将一个无序序列构造成了一个大顶堆。

步骤二:将堆顶元素与末尾元素进行交换,使末尾元素最大。然后继续调整堆,再将堆顶元素与末尾元素交换,得到第二大元素,如此反复进行交换,重建,交换。

1)将堆顶元素9和末尾元素4进行交换

2)重新调整结构,使其继续满足堆定义

3)再将堆顶元素8与末尾元素5进行交换,得到第二大元素8

4)后续过程,继续进行调整,交换,如此反复进行,最终使得整个序列有序

4、堆排序(算法)代码实现

 public static void heapSort(int[] arr) {int temp = 0;//将无序序列构建成一个堆,根据升序降序需求选择大顶堆或小顶堆for (int i = arr.length / 2 - 1; i >= 0; i--) {adjustHeap(arr,i,arr.length);}//将堆顶元素与末尾元素交换。将最大的元素沉到数组末端for (int j = arr.length-1; j > 0; j--) {temp = arr[j];arr[j] = arr[0];arr[0] = temp;//重新调整结构,使其满足堆定义,然后继续交换堆顶元素与当前末尾元素,反复执行调整+交换步骤,直到整个序列有序adjustHeap(arr,0,j);}}/** 将一个数组(二叉树)调整成一个大顶堆* 功能:完成将以i对应的非叶子节点的树调整成大顶堆* @param arr 待调整的数组* @param i 表示非叶子节点在数组中的索引* @param length 表示对多少个元素继续调整,length是在逐渐的减少*/public static void adjustHeap(int[] arr,int i, int length) {int temp = arr[i]; //取出当前元素的值保存在临时变量//k = 2 * i + 1是i节点的左子节点for (int k = 2 * i + 1; k < length; k = 2 * k + 1) {if(k + 1 < length && arr[k] < arr[k + 1]) { //说明左子节点的值小于右子节点的值k++; //k指向右子节点}if(arr[k] > temp) { //如果子节点大于父节点arr[i] = arr[k]; //把较大的值赋给当前节点i = k; //i指向k继续比较} else {break;}}//当for循环结束后,我们已经将以i为父节点的树的最大值,放在了最顶(局部)arr[i] = temp; //将temp的值放到调整后的位置}

5、总结堆排序的基本思路

①、将无序序列构建成一个堆,根据升序降序需求选择大顶堆或小顶堆;
②、将堆顶元素与末尾元素进行交换,将最大元素“沉”到数组末端;
③、重新调整结构,使其满足堆定义,然后继续交换堆顶元素与当前末尾元素,反复执行调整+交换步骤,直到整个序列有序。

堆排序(Java语言实现)相关推荐

  1. Java语言实现的各种排序

    用Java语言实现的各种排序,包括插入排序.冒泡排序.选择排序.Shell排序.快速排序.归并排序.堆排序.SortUtil等. 插入排序: package org.rut.util.algorith ...

  2. JAVA语言知识点总结

    一.Java SE ❤1.Java基础 1.一个十进制的数在内存中是怎么存的? Java支持的数据类型有哪些?什么是自动拆装箱? int 和 Integer 有什么区别 ? 什么时候使用int 什么时 ...

  3. 我们一起来排序——使用Java语言优雅地实现常用排序算法

    破阵子·春景 燕子来时新社,梨花落后清明. 池上碧苔三四点,叶底黄鹂一两声.日长飞絮轻. 巧笑同桌伙伴,上学径里逢迎. 疑怪昨宵春梦好,元是今朝Offer拿.笑从双脸生. 排序算法--最基础的算法,互 ...

  4. s数据结构替换子表java版_数据结构与算法分析Java语言描述(第3版) PDF和源码免费 下载...

    <数据结构与算法分析Java语言描述(第3版)>PDF和源码免费 下载 免积分下载 用户下载说明: 图书简介: 数据结构:Java语言描述(原书第3版)是国外数据结构与算法分析方面的经典教 ...

  5. Java语言中的数据类型

    Java语言是一种强调数据类型的语言,在声明任何变量时,必须将该变量定义为一种数据类型. Java中的数据类型包括基本类型和对象类型,基本类型总共有8种,其中4种整形.1种字符型.2种浮点型.1种布尔 ...

  6. java语言环境变量_JAVA语言环境变量的设置教程

    本文主要向大家介绍了JAVA语言环境变量的设置教程,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助. 安装JDK到目录,我这里是C:\Java 右键点击计算机属性 在系统变量里面建 JA ...

  7. java语言的实现机制_JAVA语言之Java NIO的工作机制和实现原理介绍

    本文主要向大家介绍了JAVA语言之Java NIO的工作机制和实现原理介绍,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助. 前言 本文只简单介绍NIO的原理实现和基本工作流程 I/O和 ...

  8. Java语言的基础知识9

    第十一章(线程) 1.通过String name=Thread.currentThread().getName();来获取当前线程的名称. 2.多次启动一个线程或者启动一个已经运行的线程是非法的,会抛 ...

  9. 重塑云上的 Java 语言

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 Photo @  Toa Heftiba 文 |郁磊 音乐无国界, ...

  10. 四川大学java试题_四川大学2013年计算机(软件)学院Java语言程序设计期末考试试题B卷...

    四川大学期末考试试题(闭卷) (2013 -2014学年第1学期) 课程号:课程名称: Java语言程序设计(B 卷)任课教师: 适用专业年级:学号:姓名: 一.单项选择题(本大题共20小题,每小题2 ...

最新文章

  1. 关于 Python3.9,看这张 16 岁高中生做的「新特性必知图」就够了
  2. ensp查看历史配置命令_eNSP常用命令.doc
  3. IDEA快捷键拆解系列(五):Navigate篇
  4. hadoop程序运行
  5. spring源码分析之spring-web remoting模块概况及基本概念
  6. int转string的3种方法
  7. fst java_java快速序列化库FST
  8. Response.Redirect(),Server.Transfer(),Server.Execute()的区别
  9. C++之string的底层真的是用char数组来实现的么?
  10. 【原】对txt文本进行数据读取
  11. Web Server
  12. FTP,SFTP,FTPS,TF区别
  13. 井字棋游戏的实现和注意细节
  14. 两种常见的台式计算机,win7电脑定时关机的两种最常用方法【图文】
  15. android 4.4 设置谷歌拼音输入法为默认输入法,android4.4修改出厂默认输入法
  16. 你真的了解“药品追溯码”吗?
  17. ldap + sentry架构的相关结论的验证
  18. win10系统无法访问ftp服务器地址,win10如何访问ftp服务器地址
  19. 2020年软件评测师真题精选
  20. 奥利给:力扣160:相交链表

热门文章

  1. 《模拟电子技术基础》课程笔记(七)——放大电路
  2. i.MX6ULL终结者Linux RS232/485驱动实验RS232驱动
  3. 中国人口增长的数学模型(for数学建模)
  4. 2021 年 6 个GitHub推荐前端项目
  5. 怎样使用SQL SERVER新建立一个数据库
  6. 《硅谷之火》书评:时代变迁中的硅谷摇滚明星
  7. 图书馆预约占座系统 (SSM JAVA)
  8. MongoDb数据库连接工具
  9. Linux脚本的创建
  10. Linux脚本的建立与执行