堆排序是利用堆的特性进行排序的过程。

堆排序:输出堆顶的最小(大)值后,使剩余的n-1个元素序列重新再建成堆,则可得到原序列的次小(大)值。反复进行可得到一个有序序列,整个过程称为堆排序。

堆排序分为两个步骤:

根据初始输入数据,形成初始堆;

通过一系列的记录交换和重新调整堆进行排序。

public class HeapSort {

// 主函数

public static void main(String[] args) {

int[] arr = { 27, 83, 96, 38, 11, 9 };

sort(arr);

}

// 排序

public static void sort(int[] arr) {

// arr为待排序表, n为表的长度

int n = arr.length;

display("原始数据 : ", arr);

// 建堆函数:根据堆的定义,从最后一个非终端结点(第(n-2)/2个)开始筛选,直至到根结点为止。这一过程使得初始序列 arr[0..n-1] 建成一个堆。

// 构建大顶堆

for (int i = (n - 2) / 2; i >= 0; i--) {

adjustHeap(arr, i, n);

display("构建中: ", arr);

}

display("大顶堆 : ", arr);

// 调整堆结构

// 交换堆顶元素与末尾元素

for (int j = n - 1; j > 0; j--) {

// 将堆顶元素与末尾元素进行交换

swap(arr, 0, j);

// 重新对堆进行调整

adjustHeap(arr, 0, j);

display("排序中: ", arr);

}

display("排序结果: ", arr);

}

// 调整大顶堆

public static void adjustHeap(int[] arr, int i, int length) {

// 先取出当前元素i

int temp = arr[i];

// 从i结点的左子结点开始,也就是2i+1处开始

for (int k = i * 2 + 1; k < length; k = k * 2 + 1) {

// 如果左子结点小于右子结点,k指向右子结点

if (k + 1 < length && arr[k] < arr[k + 1]) {

k++;

}

// 如果子节点大于父节点,将子节点值赋给父节点。不用进行交换。

if (arr[k] > temp) {

arr[i] = arr[k];

i = k;

} else {

break;

}

}

// 将temp值放到最终的位置

arr[i] = temp;

}

// 交换元素

public static void swap(int[] arr, int a, int b) {

int temp = arr[a];

arr[a] = arr[b];

arr[b] = temp;

}

// 显示

public static void display(String str, int[] arr) {

System.out.println(str);

for (int i = 0; i < arr.length; i++) {

System.out.print(arr[i] + " ");

}

System.out.println();

}

}

原始数据 :

27 83 96 38 11 9

构建中:

27 83 96 38 11 9

构建中:

27 83 96 38 11 9

构建中:

96 83 27 38 11 9

大顶堆 :

96 83 27 38 11 9

排序中:

83 38 27 9 11 96

排序中:

38 11 27 9 83 96

排序中:

27 11 9 38 83 96

排序中:

11 9 27 38 83 96

排序中:

9 11 27 38 83 96

排序结果:

9 11 27 38 83 96

java heap排序_关于Java排序算法-堆排序(Heap Sort)相关推荐

  1. 经典排序算法 - 堆排序Heap sort

    经典排序算法 - 堆排序Heap sort 堆排序有点小复杂,分成三块 第一块,什么是堆,什么是最大堆 第二块,怎么将堆调整为最大堆,这部分是重点 第三块,堆排序介绍 第一块,什么是堆,什么是最大堆 ...

  2. java 英文字符串排序_英文字符串排序算法

    编程工作偶尔会遇到一些不常见问题需要处理,学编程处理问题也难免需要熟悉一些算法 以前学习的时候就遇到过一个看似简单的排序算法问题,当时的解决办法是我没有用过的,在此记录一下'' 问题 - 英文字符串排 ...

  3. java 桶排序_[图解] 桶排序

    桶排序是一种排序的思想,其实现包括计数排序和基数排序两种,冒泡排序.选择排序.插入排序.归并排序.快速排序和堆排序都是基于比较的排序,而桶排序提出了一种新的思路,即基于数据状态的排序. 1. 桶排序的 ...

  4. java字符串排序_对字符串排序持一种宽容的心态

    在Java中一涉及中文处理就会冒出很多问题来,其中排序也是一个让人头疼的课题,我们来看下面的代码: 上面的代码定义一个数组,然后进行升序排序,我们期望的结果是按照拼音升序排列,即为李四.王五.张三,但 ...

  5. java数组给名字排序_用Java给数组排序

    public class BubbleDemo { public static void main(String[] args) { int arr[]={1,3,5,7,2,4,6,8,9}; bu ...

  6. java 文件内容排序_在Java中对2个大型文本文件进行排序的最佳方法是什么?

    我正在构建一个简单的 Java应用程序,涉及从csv文件中读取信息. csv文件中的信息以这种形式出现: "ID","Description" "AB ...

  7. java字符串数组排序_在Java中对字符串数组进行排序

    允许用户使用字符串数组.他们可以向数组添加字符串,从数组中删除字符串,搜索数组中的字符串,最终他们将能够对数组进行排序.分类是搞砸我的原因.我尝试过几种不同的方法.第一种方法是将数组转换为ArrayL ...

  8. Java指令屏障_指令重排序和内存屏障

    sap hana计算技术项目实战指南内存 61元 (需用券) 去购买 > 一.指令重排序 指令重排序分为三种,分别为编译器优化重排序.指令级并行重排序.内存系统重排序.如图所示,后面两种为处理器 ...

  9. java字母排序_【Java】实现按中文首字母排序 | 学步园

    要实现"按中文首字母排序"操作,可以使用java.util包下的Arrays类的sort()函数. Arrays类包含用来操作数组(比如排序和搜索)的各种方法. 比如对于排序操作的 ...

最新文章

  1. mysql div 没有小数,mysql order by limit 的一个坑
  2. 微众WeCross 跨链平台(3)交易流程
  3. 《众妙之门——用户体验设计的秘密》一2.3 触摸至上的设计
  4. 计算机配置扫盲,扫盲了。。怎么识别电脑配置好坏?
  5. mysql 数据表中查找重复记录(条数)
  6. 数字视频广播字幕系统(第6.7章)
  7. 第3章 Hive数据类型
  8. 使用Keras画神经网络准确性图
  9. 前端程序员的日常与心酸
  10. LuatIDE是什么?
  11. cesium 根据SampledPositionProperty与timeline实现轨迹回放功能(跟随视角、上帝视角) 详细代码与理解记录
  12. 使用Fiddler和雷电模拟器抓取安卓https请求
  13. Mixly电子音乐:蜗牛与黄鹂鸟
  14. 计算机编程专业有哪些好的大学?
  15. 【程序源代码】外卖侠源码
  16. The environmenthvariable 'Path' seems to ave some paths containing characters (';', '' or ';;').
  17. cad怎么画坐标系箭头_怎样用CAD画一个路标箭头?,来学习吧
  18. SDN控制器的功能及作用—Vecloud
  19. 在国际化中如何获取当前浏览器的语种
  20. 七月算法机器学习笔记4 凸优化

热门文章

  1. 为什么使用 Redis及其产品定位
  2. nmon--linux压力测试工具
  3. 网页中Flash播放器常用参数设置(转)
  4. Vue-Cli4笔记
  5. python循环体执行的次数与其他不同的是_【单选题】下面Python循环体执行的次数与其他不同的是( )...
  6. 分布式 集群 系统组件架构_分布式跟踪系统的四个组件如何一起工作
  7. linux /etc/目录_Linux / etc /目录的版本控制
  8. summit_Linux注册简介开始,Open Hardware Summit寻求提交,等等
  9. VSCode自定义代码片段13——Vue的状态大管家
  10. 第三十四章 批量印刷书籍