堆排序Java代码实现
堆排序
堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。
算法描述
- 将初始待排序关键字序列 (R1,R2….Rn) 构建成大顶堆,此堆为初始的无序区;
- 将堆顶元素 R[1] 与最后一个元素 R[n] 交换,此时得到新的无序区 (R1,R2,……Rn-1) 和新的有序区 (Rn),且满足 R[1, 2… n-1] <= R[n];
- 由于交换后新的堆顶 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代码实现相关推荐
- 十大经典排序算法之堆排序(Java代码实现)
算法原理 堆排序(Heap Sort)是指利用堆这种数据结构所设计的一种排序算法.堆积是一个近视完全二叉树的结构,并同时满足堆积的性质:即子节点的键值或索引总是小于(或者大于)它的父节点.堆排序可以说 ...
- 堆排序和归并排序 java代码实现
文章目录 堆排序 java代码实现 单元测试 归并排序 java代码实现 单元测试 堆排序 java代码实现 package csdn.dreamzuora.sort;import java.util ...
- 买什么数据结构与算法,这里有:动态图解十大经典排序算法(含JAVA代码实现)
上篇的动图数据结构反响不错,这次来个动图排序算法大全.数据结构与算法,齐了. 几张动态图捋清Java常用数据结构及其设计原理 本文将采取动态图+文字描述+正确的java代码实现来讲解以下十大排序算法: ...
- java array 元素的位置_数据结构与算法:动态图解十大经典排序算法(含JAVA代码实现)...
点击上方"JAVA",星标公众号 重磅干货,第一时间送达 本文将采取动态图+文字描述+正确的java代码实现来讲解以下十大排序算法: 冒泡排序 选择排序 插入排序 希尔排序 归并排 ...
- java代码_Java 代码实现排序算法
阅读本文约需要8分钟 大家好,我是你们的导师,我每天都会在这里给大家分享一些干货内容(当然了,周末也要允许老师休息一下哈).上次老师跟大家分享了下SpringBoot+Gradle+ MyBa ...
- 冒泡排序java代码_面试官问我插入排序和冒泡排序哪个更牛逼?
(给算法爱好者加星标,修炼编程内功) 来源:小鹿动画学编程,作者:小鹿同学 写在前边 排序对于每个开发者来讲,都多多少少知道几个经典的排序算法,比如我们之前以动画形式分享的冒泡排序,也包括今天要分享的 ...
- 堆排序-Java小顶堆排序
二叉堆满足二个特性: 1.父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值. 2.每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆). 当父结点的键值总是大于或等于任何一个子 ...
- 剑指Offer第二版Java代码实现
剑指Offer第二版Java代码实现 A.单例模式 面试题 2:实现Singleton模式 B.面试需要的基础知识 面试题 3:数组中重复的数字 面试题 4:二维数组的查找 面试题 5:替换空格 面试 ...
- 编写高性能Java代码的最佳实践
编写高性能Java代码的最佳实践 摘要:本文首先介绍了负载测试.基于APM工具的应用程序和服务器监控,随后介绍了编写高性能Java代码的一些最佳实践.最后研究了JVM特定的调优技巧.数据库端的优化和架 ...
- cmd怎么实现Java你好_java环境配置以及如何在cmd窗口运行java代码
对于初学java的人来说,电脑的环境配置也许会让你头疼,但只要你认真一些学习,相信对你来说都是OK的啦~ 首先回到桌面,选择我的电脑,单击右键属性,进入高级系统设置,点击环境变量设置.用户变量选择Te ...
最新文章
- 【转】关于Apache与Nginx的优势比较
- 让你受用一辈子的181句话
- Android—屏幕适配和卡顿优化
- linux php连接orcel,Linux下PHP连接Oracle数据库
- 量子位首款周边卫衣上线,给你AI的力量
- Android:Android学习路线图
- 矩阵论7,8,9作业
- 唐诗赏析html网页制作,【毕业论文】古诗词鉴赏网站的设计与实现.doc
- fiddler 手机 https 抓包
- 大数据十道经典海量数据处理面试题与十个方法大总结
- Unity Editor模式编辑属性即时生效
- 微信公众号开发——实现用户微信网页授权流程
- ps CS6 不能直接拖入图片的问题!!win8 系统下
- 拓展KubeVela模块,看addon如何助力开放生态
- 别再问什么是数据库分库分表了,看这里!
- 9款好看又实用的手机APP UI模板
- DIY 章鱼猫活动 |
- GO + React + Axios Response to preflight request doesn't pass access control check: It does not hav
- 云主机和物理机有什么区别?
- USB射频功率计DIY——构建软件校准方案
热门文章
- 5分钟实战QQ机器人教程(保姆级)
- 程序员常用不常见很难得的地址大全
- BP 神经网络用于模式分类
- 如何写前端开发的改进建议书?
- html 【一个简单的用户登录页面代码】
- android 浏览器 内核版本,Android集成三方浏览器之X5内核
- redis的设计与实现
- C语言自动刷视频源码,使用C语言快速制作一个视频播放器,使用这个开源库就可以了...
- 儿童学计算机编程好处,十个理由告诉你孩子为什么要学习编程?
- 模式识别与机器学习 (Pattern Recognization and Maching Learning)(PRML) 总结