1 堆排序

堆是一种重要的数据结构,分为大根堆和小根堆,是完全二叉树, 底层如果用数组存储数据的话,假设某个元素为序号为i(Java数组从0开始,i为0到n-1),如果它有左子树,那么左子树的位置是2i+1,如果有右子树,右子树的位置是2i+2,如果有父节点,父节点的位置是(n-1)/2取整。最大堆的任意子树根节点不小于任意子结点,最小堆的根节点不大于任意子结点。
所谓堆排序就是利用堆这种数据结构的性质来对数组进行排序,在数组的非降序排序中,需要使用的就是大根堆,因为根据大根堆的性质可知,最大的值一定在堆顶。堆排序一种不稳定的排序算法,其时间复杂度为O(nlogn)。
2 算法思想
(1)构建最大堆;
(2)选择顶,并与第0位置元素交换;
(3)由于步骤(2)的的交换可能破环了最大堆的性质,即第0位置的元素不再是最大元素,则需要调用maxHeap调整堆(沉降法),根据实际情况重复步骤(2)。
堆排序中最重要的算法就是maxHeap,该函数假设一个元素的两个子节点都满足最大堆的性质(即左、右子树都是最大堆),只有根元素可能违反最大堆性质,那么把该元素以及左右子节点的最大元素找出来,如果该元素已经最大,那么整棵树都是最大堆,程序退出,否则交换根元素与最大元素的位置,继续调用maxHeap构建最大元素所在的子树。
3 Java代码
public class HeapSort {
public static void main(String[] args) {
int[] arr = {3, 2, 1, 0, -1, -2, -3};
System.out.println("Before heap:");
printArray(arr);
heapSort(arr);
System.out.println("After heap sort:");
printArray(arr);
}
public static void heapSort(int[] arr) {
if (arr == null || arr.length <= 1) {
return;
}
buildMaxHeap(arr); //构建最大堆
for (int i = arr.length - 1; i >= 1; i--) {
exchangeElements(arr, 0, i); //交换堆顶和第0位置元素
maxHeap(arr, i, 0); //因为交换元素后,有可能违反堆的性质,所以沉降元素
}
}
private static void buildMaxHeap(int[] arr) { //构建最大堆
if (arr == null || arr.length <= 1) {
return;
}
int half = arr.length / 2;
for (int i = half; i >= 0; i--) {
maxHeap(arr, arr.length, i);
}
}
private static void maxHeap(int[] arr, int heapSize, int index) {
int left = index * 2 + 1; //左子树上的元素
int right = index * 2 + 2; //右子树上的元素
int largest = index; //初始化最大元素
if (left < heapSize && arr[left] > arr[index]) {
largest = left;
}
if (right < heapSize && arr[right] > arr[largest]) {
largest = right;
}
if (index != largest) { //判断根元素是否为最大元素
exchangeElements(arr, index, largest);
maxHeap(arr, heapSize, largest);
}
}
public static void printArray(int[] arr) { //打印数组
System.out.print("{");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]);
if (i < arr.length - 1) {
System.out.print(", ");
}
}
System.out.println("}");
}
public static void exchangeElements(int[] arr, int index1, int index2) { //交换元素
int temp = arr[index1];
arr[index1] = arr[index2];
arr[index2] = temp;
}
}
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# 堆排序(HeapSort)
# java
# 堆排序
# HeapSort
# Java数据结构之优先级队列(堆)图文详解
# Java 数据结构与算法系列精讲之二叉堆
# Java深入了解数据结构之优先级队列(堆)
# 深入了解Java数据结构和算法之堆
# Java数据结构中堆的向下和向上调整解析
# Java 数据结构之堆的概念与应用
# java数据结构-堆实现优先队列
# Java 超详细讲解数据结构中的堆的应用
# 子树
# 大堆
# 都是
# 数据结构
# 树上
# 是一种
# 有可能
# 最重要
# 希望能
# 实际情况
# 谢谢大家
# 不稳定
# 并与
# 为大
# 棵树
# 则需
# 把该
# 降序
# 二叉树
# 不小于
相关文章:
如何制作一个表白网站视频,关于勇敢表白的小标题?
想学网站制作怎么学,建立一个网站要花费多少?
如何确保西部建站助手FTP传输的安全性?
动图在线制作网站有哪些,滑动动图图集怎么做?
小型网站制作HTML,*游戏网站怎么搭建?
如何选择PHP开源工具快速搭建网站?
如何在万网自助建站中设置域名及备案?
定制建站哪家更专业可靠?推荐榜单揭晓
如何快速建站并高效导出源代码?
外贸公司网站制作哪家好,maersk船公司官网?
Bpmn 2.0的XML文件怎么画流程图
洛阳网站制作公司有哪些,洛阳的招聘网站都有哪些?
,网页ppt怎么弄成自己的ppt?
如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?
微信小程序制作网站有哪些,微信小程序需要做网站吗?
建站主机助手选型指南:2025年热门推荐与高效部署技巧
长沙做网站要多少钱,长沙国安网络怎么样?
网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?
,怎么在广州志愿者网站注册?
建站之星价格显示格式升级,你的预算足够吗?
网站制作员失业,怎样查看自己网站的注册者?
北京网站制作的公司有哪些,北京白云观官方网站?
建站之星如何快速生成多端适配网站?
如何通过多用户协作模板快速搭建高效企业网站?
海南网站制作公司有哪些,海口网是哪家的?
c++怎么实现高并发下的无锁队列_c++ std::atomic原子变量与CAS操作【详解】
制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?
韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南
广州营销型建站服务商推荐:技术优势与SEO优化解析
如何设置并定期更换建站之星安全管理员密码?
如何选择可靠的免备案建站服务器?
惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?
建站之星导航如何优化提升用户体验?
黑客如何通过漏洞一步步攻陷网站服务器?
制作网站哪家好,cc、.co、.cm哪个域名更适合做网站?
企业宣传片制作网站有哪些,传媒公司怎么找企业宣传片项目?
如何选择适合PHP云建站的开源框架?
视频网站app制作软件,有什么好的视频聊天网站或者软件?
如何确保FTP站点访问权限与数据传输安全?
如何在Windows虚拟主机上快速搭建网站?
建站主机选哪种环境更利于SEO优化?
油猴 教程,油猴搜脚本为什么会网页无法显示?
定制建站如何定义?其核心优势是什么?
小程序网站制作需要准备什么资料,如何制作小程序?
北京建设网站制作公司,北京古代建筑博物馆预约官网?
如何选择长沙网站建站模板?H5响应式与品牌定制哪个更优?
贸易公司网站制作流程,出口贸易网站设计怎么做?
简易网站制作视频教程,使用记事本编写一个简单的网页html文件?
行程制作网站有哪些,第三方机票电子行程单怎么开?
*请认真填写需求信息,我们会在24小时内与您取得联系。