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 超详细讲解数据结构中的堆的应用
# 子树
# 大堆
# 都是
# 数据结构
# 树上
# 是一种
# 有可能
# 最重要
# 希望能
# 实际情况
# 谢谢大家
# 不稳定
# 并与
# 为大
# 棵树
# 则需
# 把该
# 降序
# 二叉树
# 不小于
相关文章:
建站之星24小时客服电话如何获取?
如何快速辨别茅台真假?关键步骤解析
北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?
武汉外贸网站制作公司,现在武汉外贸前景怎么样啊?
如何挑选最适合建站的高性能VPS主机?
桂林网站制作公司有哪些,桂林马拉松怎么报名?
如何规划企业建站流程的关键步骤?
如何通过西部数码建站助手快速创建专业网站?
,购物网站怎么盈利呢?
表情包在线制作网站免费,表情包怎么弄?
小说建站VPS选用指南:性能对比、配置优化与建站方案解析
定制建站流程步骤详解:一站式方案设计与开发指南
*服务器网站为何频现安全漏洞?
建站主机如何安装配置?新手必看操作指南
如何快速查询域名建站关键信息?
购物网站制作公司有哪些,哪个购物网站比较好?
武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?
上海网站制作开发公司,上海买房比较好的网站有哪些?
手机网站制作与建设方案,手机网站如何建设?
建站VPS选购需注意哪些关键参数?
网站制作话术技巧,网站推广做的好怎么话术?
如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?
建站之星如何防范黑客攻击与数据泄露?
宁波免费建站如何选择可靠模板与平台?
建站主机空间推荐 高性价比配置与快速部署方案解析
韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐
建站ABC备案流程中有哪些关键注意事项?
如何在腾讯云服务器快速搭建个人网站?
高端云建站费用究竟需要多少预算?
北京企业网站设计制作公司,北京铁路集团官方网站?
完全自定义免费建站平台:主题模板在线生成一站式服务
如何用已有域名快速搭建网站?
山东网站制作公司有哪些,山东大源集团官网?
视频网站制作教程,怎么样制作优酷网的小视频?
c++ stringstream用法详解_c++字符串与数字转换利器
建站之星备案是否影响网站上线时间?
C++如何编写函数模板?(泛型编程入门)
b2c电商网站制作流程,b2c水平综合的电商平台?
高防服务器:AI智能防御DDoS攻击与数据安全保障
建站之星客服服务时间及联系方式如何?
长沙企业网站制作哪家好,长沙水业集团官方网站?
如何撰写建站申请书?关键要点有哪些?
太平洋网站制作公司,网络用语太平洋是什么意思?
建站主机与虚拟主机有何区别?如何选择最优方案?
平台云上自主建站:模板化设计与智能工具打造高效网站
如何用美橙互联一键搭建多站合一网站?
如何通过FTP服务器快速搭建网站?
如何快速搭建高效香港服务器网站?
胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?
如何快速搭建响应式可视化网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。