在实现堆排序之前 我们先来介绍一下什么是最大堆与最小堆

最大堆 与最小堆 都是一个二叉树 也称为二叉堆

二叉堆的定义
每个节点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆)

最大堆 : 当父节点的键值总是大于或等于每一个子节点 时被称为最大堆

最小堆 : 当父节点的键值总是小于或等于每一个子节点 时被称为最小堆

最小堆 :

                   12            317        19     36    7 25   100

最大堆:

                10098         9767    6345   23

一般的堆的存储都用数组来完成 ,所以一个节点的父节点就为 (节点下标-1)/2 他的左右子节点分别为2*i+1 和 2*i+2

例子 :

            1015        5623   75                                             array[]={10.15,56.23.75};

15的父节点就为 (1-1)/2 =0 左右子节点为 array[2*1+1]=23 array[2*1+2]=75

我们已经理解了什么是最大堆 与最小堆了,现在我们来编写代码


/** *功能  快速排序* *作者 blue* *data 4.5* */
public class MaxHeapsortDemo {private static int[] sort = new int[]{1,0,10,10,3,5,6,4,9,8,12,17,34,11};public static void main(String[] args) {builddMaxHeapify(sort);heapSort(sort);Prtint(sort);}private static void Prtint(int[] sort2) {for (int i = 0; i < sort2.length; i++) {System.out.print(" "+sort2[i]);}}private static void builddMaxHeapify(int[] data) {int startIndex = (data.length-2)>>1;//得到数组最后一位的父节点for (int i = startIndex; i>=0; i--) {maxHeap(data, data.length, i);}}private static void maxHeap(int[] data ,int heapSize,int index) {int leftChildIndex = (index<<1)+1;//得到该节点的左子节点int rightChildIndex = (index<<1)+2;//得到该节点的右子节点int largest =index;/** 找到当前节点与左右节点的的最大值*/if (leftChildIndex<heapSize&&data[index]<data[leftChildIndex]) {largest = leftChildIndex;}if (rightChildIndex<heapSize&&data[largest]<data[rightChildIndex]) {largest = rightChildIndex;}/** 如果当前的父节点不是最大点,就交换节点与最大节点的值,*/if (largest!=index) {int temp = data[index];data[index] =data[largest];data[largest] =temp;maxHeap(data, heapSize, largest);}}/** *从第一父节点开始交换,把第一父节点交换给最后一个节点,然后再调用MaxHeap 从新排最大堆*/private static void heapSort(int[] data) {for (int i = data.length-1; i >=0; i--) {int temp = data[0];data[0]=data[i];data[i]=temp;maxHeap(data, i, 0);}}}

我们首先 将一个乱序的数组 排成了一个最大堆 ,
首先 找到一个父节点 ,然后找到左右子节点,判断三个节点的键值的最大,如果父节点不是最大就要与最大的子节点交换,交换 之后的子节点已经不满足最大堆 ,所以这个时候我们就需要递归来继续重排最大堆

意思就是 刚开始是 56|67 23 发现 56不是最大节点 然后把 67 和 56 换掉 这个时候 原先67的左右子节点就不满足56 了 所以就要重新构成最大堆

在构成最大堆后 ,我们就开始排序了

首先这个最大堆得最大父节点 与最后一位交换,交换之后 就又不满足最大堆的特性,所以这时候我们又要重新调用maxHeap 函数 来重新构成最大堆了
这个时候我们发现,最大父节点已经是上一个父节点的左子节点
如图所示 :

END!

java实现 堆排序相关推荐

  1. java 实现 堆排序算法_C程序实现堆排序算法

    java 实现 堆排序算法 Heap Sort is a comparison-based sorting algorithm that makes use of a different data s ...

  2. java的堆排序_java中什么是堆排序?堆排序介绍

    本篇文章给大家带来的内容是java中什么是堆排序?堆排序介绍.有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助.堆排序介绍: 堆排序可以分为两个阶段.在堆的构造阶段,我们将原始数组重新组 ...

  3. Java数据结构——堆排序

    文章目录 一.堆排序 (一).什么是堆排序 (二).图例 (三).Java代码 一.堆排序 (一).什么是堆排序 知识卡片: 1. 堆排序(HeapSort). 2. 堆排序是指利用堆这种数据结构所设 ...

  4. Java实现堆排序算法

    堆排序是计算机编程中一种流行且高效的排序算法.学习如何编写堆排序算法需要了解两种类型的数据结构-数组和树. 我们要排序的初始数字集存储在数组中,例如[10, 3, 76, 34, 23, 32],排序 ...

  5. java实现堆排序_Java 实现堆排序

    堆 堆排序和合并排序一样,是一种时间复杂度为O(nlgn)的算法,同时和插入排序一样,是一种就地排序算法(不需要额外的存储空间).堆排序需要用到一种被称为最大堆的数据结构,与java或者lisp的gc ...

  6. Java实现堆排序(大根堆),实战

    //构建大根堆:将array看成完全二叉树的顺序存储结构 private int[] buildMaxHeap(int[] array){ //从最后一个节点array.length-1的父节点(ar ...

  7. Java实现堆排序及详细图解

    文章目录 堆排序 前言 实现步骤 代码实现 堆排序 前言 堆排序(HeapSort)是指利用堆这种数据结构所设计的一种排序算法.堆积是一个近似于完全二叉树的结构,同时满足子节点的键值总是小于(或者大于 ...

  8. java实现堆排序_Java实现堆排序(大根堆)

    堆排序是一种树形选择排序方法,它的特点是:在排序的过程中,将array[0,...,n-1]看成是一颗完全二叉树的顺序存储结构,利用完全二叉树中双亲节点和孩子结点之间的内在关系,在当前无序区中选择关键 ...

  9. Java PriorityQueue实现大顶堆

    Java中PriorityQueue通过二叉小顶堆实现,可以用一棵完全二叉树表示.PriorityQueue位于Java util包中,实际上这个队列就是具有"优先级".既然具有优 ...

最新文章

  1. 如何设计一门语言(八)——异步编程和CPS变换
  2. python中使用格式化字符串
  3. 大咖白话 Serverless 训练营,限时报名开启!
  4. 容器编排技术 -- Kubernetes kubectl expose命令详解
  5. vue2学习计划1-3 浏览器跨域问题(mock-api)
  6. [LeetCode] 342. Power of Four(位操作)
  7. LeetCode第617题:合并二叉树
  8. seo入门必备[转载]
  9. html插入动态背景,HTML 动态背景
  10. 真正“透明”的PNG图片
  11. 电路设计_铝电解电容的失效原因
  12. RTL8189ES/ETV/FTV系列模块定频软件操作手册
  13. java源文件的编写与保存_1.编写源代码编写源文件:CardLayoutDemo.java并保存,例如:I:myAppCardLayoutDemo.java。程序结构如下:p...
  14. 大学c语言毕业设计题目,关于毕业季的作文题目
  15. URP中摄像机参数的设置
  16. ORACLE中的LTRIM、RTRIM和TRIM
  17. stateflow小抄
  18. uiautomator模拟短按和长按物理按键
  19. 02功能之读写文件流操作(C语言实现读取文件指定一行)
  20. Nature旗下SCI期刊征收AI方向论文, 56%录用率, 5个月出录用

热门文章

  1. DICOM3.0标准梳理
  2. 仓促的为ic配置了一下编辑器cke和ckf
  3. 弹性云服务器做云终端,云终端解决方案中云服务器做双机热备的必要性(转载)...
  4. 手机模拟加密门禁卡 考勤卡 会员卡 停车卡 电梯卡等教程-不用电脑,无需root
  5. 黑客独角兽_写作是产品设计师真正的独角兽技能
  6. 使用python构建数据库_使用Python构建一个极简主义博客(或者,如何学习停止烦恼和热爱Web开发)。
  7. 网络爬虫-知乎Live-Live评论与观众-MongoDB数据库
  8. 蚂蚁分类信息系统mymps对接阿里云短信接口
  9. 笔记本计算机无法打开,笔记本电脑开不了机怎么办 笔记本开不了机解决方法【详解】...
  10. 89c51c语言程序,89C51单片机计算器C语言程序.doc