堆排序

堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。

算法描述

  1. 将初始待排序关键字序列 (R1,R2….Rn) 构建成大顶堆,此堆为初始的无序区;
  2. 将堆顶元素 R[1] 与最后一个元素 R[n] 交换,此时得到新的无序区 (R1,R2,……Rn-1) 和新的有序区 (Rn),且满足 R[1, 2… n-1] <= R[n];
  3. 由于交换后新的堆顶 R[1] 可能违反堆的性质,因此需要对当前无序区 (R1, R2, …… Rn-1) 调整为新堆,然后再次将 R[1] 与无序区最后一个元素交换,得到新的无序区 (R1, R2 …. Rn-2) 和新的有序区 (Rn-1, Rn)。不断重复此过程直到有序区的元素个数为 n-1,则整个排序过程完成。

算法分析

  • 时间复杂度:

    • 最佳情况:T(n) = O(nlogn)
    • 最差情况:T(n) = O(nlogn)
    • 平均情况:T(n) = O(nlogn)
  • 空间复杂度:O(1)
  • 稳定性:不稳定

代码实现

public class HeapSort {public static void heapSort(int[] arr) {if (arr == null || arr.length <= 1) return;// 建堆。buildHeap(arr);int len = arr.length;while (len > 1) {// 把堆顶和最后一个元素交换。swap(arr, 0, len - 1);// 交换完之后,逻辑上去掉最后一个元素。len--;// 重新调整堆的顺序。heapfy(arr, 0 , len);// 把每一趟排序的结果也输出一下。print(arr);}}private static void buildHeap(int[] arr) {// 最后一个非叶子结点:2i + 1 >= arr.length  -->  i >= (arr.length - 1) / 2for (int i = (arr.length - 1) / 2 - 1; i >= 0; i--) {heapfy(arr, i, arr.length);}}// 调整堆的顺序,保持大顶堆。private static void heapfy(int[] arr, int i, int len) {while (true) {int maxPostion = i;int leftChild = 2 * i + 1;  // 左孩子索引。int rightChild = 2 * i + 2; // 右孩子索引。// 若左孩子大于最大值,则更新最大值。if (leftChild < len && arr[leftChild] > arr[maxPostion]) {maxPostion = leftChild;}// 若右孩子大于最大值,则更新最大值。if (rightChild < len && arr[rightChild] > arr[maxPostion]) {maxPostion = rightChild;}if (maxPostion == i) {break;  // 若已经是大顶堆了,则退出循环。} else {swap(arr, i, maxPostion);   // 若不是大顶堆,则交换位置。i = maxPostion;}}}private static void swap(int[] arr, int i, int j) {int temp = arr[i];arr[i] = arr[j];arr[j] =temp;}public static void main(String[] args) {int[] arr = {6, 9, 1, 4, 5, 8, 7, 0, 2, 3};System.out.print("排序前:  ");print(arr);heapSort(arr);System.out.print("排序后:  ");print(arr);}// 打印数组public static void print(int[] arr) {if (arr == null)    return;for(int i : arr) {System.out.print(i + " ");}System.out.println();}
}
/*
排序前:  6 9 1 4 5 8 7 0 2 3
8 6 7 4 5 1 3 0 2 9
7 6 3 4 5 1 2 0 8 9
6 5 3 4 0 1 2 7 8 9
5 4 3 2 0 1 6 7 8 9
4 2 3 1 0 5 6 7 8 9
3 2 0 1 4 5 6 7 8 9
2 1 0 3 4 5 6 7 8 9
1 0 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
排序后:  0 1 2 3 4 5 6 7 8 9
*/

堆排序Java代码实现相关推荐

  1. 十大经典排序算法之堆排序(Java代码实现)

    算法原理 堆排序(Heap Sort)是指利用堆这种数据结构所设计的一种排序算法.堆积是一个近视完全二叉树的结构,并同时满足堆积的性质:即子节点的键值或索引总是小于(或者大于)它的父节点.堆排序可以说 ...

  2. 堆排序和归并排序 java代码实现

    文章目录 堆排序 java代码实现 单元测试 归并排序 java代码实现 单元测试 堆排序 java代码实现 package csdn.dreamzuora.sort;import java.util ...

  3. 买什么数据结构与算法,这里有:动态图解十大经典排序算法(含JAVA代码实现)

    上篇的动图数据结构反响不错,这次来个动图排序算法大全.数据结构与算法,齐了. 几张动态图捋清Java常用数据结构及其设计原理 本文将采取动态图+文字描述+正确的java代码实现来讲解以下十大排序算法: ...

  4. java array 元素的位置_数据结构与算法:动态图解十大经典排序算法(含JAVA代码实现)...

    点击上方"JAVA",星标公众号 重磅干货,第一时间送达 本文将采取动态图+文字描述+正确的java代码实现来讲解以下十大排序算法: 冒泡排序 选择排序 插入排序 希尔排序 归并排 ...

  5. java代码_Java 代码实现排序算法

       阅读本文约需要8分钟  大家好,我是你们的导师,我每天都会在这里给大家分享一些干货内容(当然了,周末也要允许老师休息一下哈).上次老师跟大家分享了下SpringBoot+Gradle+ MyBa ...

  6. 冒泡排序java代码_面试官问我插入排序和冒泡排序哪个更牛逼?

    (给算法爱好者加星标,修炼编程内功) 来源:小鹿动画学编程,作者:小鹿同学 写在前边 排序对于每个开发者来讲,都多多少少知道几个经典的排序算法,比如我们之前以动画形式分享的冒泡排序,也包括今天要分享的 ...

  7. 堆排序-Java小顶堆排序

    二叉堆满足二个特性:  1.父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值. 2.每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆).  当父结点的键值总是大于或等于任何一个子 ...

  8. 剑指Offer第二版Java代码实现

    剑指Offer第二版Java代码实现 A.单例模式 面试题 2:实现Singleton模式 B.面试需要的基础知识 面试题 3:数组中重复的数字 面试题 4:二维数组的查找 面试题 5:替换空格 面试 ...

  9. 编写高性能Java代码的最佳实践

    编写高性能Java代码的最佳实践 摘要:本文首先介绍了负载测试.基于APM工具的应用程序和服务器监控,随后介绍了编写高性能Java代码的一些最佳实践.最后研究了JVM特定的调优技巧.数据库端的优化和架 ...

  10. cmd怎么实现Java你好_java环境配置以及如何在cmd窗口运行java代码

    对于初学java的人来说,电脑的环境配置也许会让你头疼,但只要你认真一些学习,相信对你来说都是OK的啦~ 首先回到桌面,选择我的电脑,单击右键属性,进入高级系统设置,点击环境变量设置.用户变量选择Te ...

最新文章

  1. 【转】关于Apache与Nginx的优势比较
  2. 让你受用一辈子的181句话
  3. Android—屏幕适配和卡顿优化
  4. linux php连接orcel,Linux下PHP连接Oracle数据库
  5. 量子位首款周边卫衣上线,给你AI的力量
  6. Android:Android学习路线图
  7. 矩阵论7,8,9作业
  8. 唐诗赏析html网页制作,【毕业论文】古诗词鉴赏网站的设计与实现.doc
  9. fiddler 手机 https 抓包
  10. 大数据十道经典海量数据处理面试题与十个方法大总结
  11. Unity Editor模式编辑属性即时生效
  12. 微信公众号开发——实现用户微信网页授权流程
  13. ps CS6 不能直接拖入图片的问题!!win8 系统下
  14. 拓展KubeVela模块,看addon如何助力开放生态
  15. 别再问什么是数据库分库分表了,看这里!
  16. 9款好看又实用的手机APP UI模板
  17. DIY 章鱼猫活动 |
  18. GO + React + Axios Response to preflight request doesn't pass access control check: It does not hav
  19. 云主机和物理机有什么区别?
  20. USB射频功率计DIY——构建软件校准方案

热门文章

  1. 5分钟实战QQ机器人教程(保姆级)
  2. 程序员常用不常见很难得的地址大全
  3. BP 神经网络用于模式分类
  4. 如何写前端开发的改进建议书?
  5. html 【一个简单的用户登录页面代码】
  6. android 浏览器 内核版本,Android集成三方浏览器之X5内核
  7. redis的设计与实现
  8. C语言自动刷视频源码,使用C语言快速制作一个视频播放器,使用这个开源库就可以了...
  9. 儿童学计算机编程好处,十个理由告诉你孩子为什么要学习编程?
  10. 模式识别与机器学习 (Pattern Recognization and Maching Learning)(PRML) 总结