【算法学习】堆排序建立最大堆
本文代码均转自:
作者:早就戒了
来源:CSDN
原文:https://blog.csdn.net/qq_37169817/article/details/79777264
版权声明:本文为博主原创文章,转载请附上博文链接!
1 public class HeapSort { 2 public static int[] maxHeap(int[] array) { 3 // 1.构建大顶堆 4 for (int i = array.length / 2 - 1; i >= 0; i--) { 5 // 从第一个非叶子结点从下至上,对于数组从右至左调整结构 6 adjustHeap(array, i, array.length); 7 } 8 return array; 9 } 10 11 private static void adjustHeap(int[] array, int i, int length) { 12 int parent = array[i]; 13 for (int k = 2 * i + 1; k < length; k = k * 2 + 1) { 14 // 2*i+1表示左节点,k = k * 2 + 1表示继续调整子节点 15 if (k + 1 < length && array[k] < array[k + 1]) 16 k = k + 1;// 找到子节点中更大的节点 17 if (array[k] > parent) { 18 array[i] = array[k];// 父节点变为更大的值 19 i = k;// 修改i的值,使之成爲新的要調整的父節點 20 } else { 21 break;// 表示无需调整,因为是自底向上的 22 } 23 } 24 array[i] = parent;// 将temp值放到最终的位置 25 } 26 27 public static void main(String[] args) { 28 int[] array = { 4, 6, 8, 5, 9 }; 29 int[] maxHeap = maxHeap(array); 30 for (int i : maxHeap) { 31 System.out.print(i + " "); 32 } 33 } 34 }
建大根堆堆思路整理:
1.找到堆中第一个非叶子结点(N0),从它开始调整左右子树。
*第一个非叶子结点的下标为:length/2 -1
*左右子树调整过程:找到其中的较大值结点Ngreater,然后与N0值作比较,如果N0<Ngreater则将两者交换,并继续调整Ngreater的叶子结点(虽然是自底向上调整的,
但是可能在某些parent下降的过程中破坏了底下子树的大小排列规则。)如果N0>=Ngreater直接开始(退出了adjustHeap函数)调整下一个非叶子结点。
2.通过循环调用adjustHeap将所有的非叶子几点调整完成。
堆排序思路:
1.建立初始堆后,将堆顶元素(最大值)与堆中最后一个元素交换,然后调整数组(堆)中的前n-1个元素。(即把数组末尾作为有序区)
2.调整到堆中只剩一个元素时,排序完成。
堆排序代码:
1 public static void sort(int []arr){ 2 //1.构建大顶堆 3 for(int i=arr.length/2-1;i>=0;i--){ 4 adjustHeap(arr,i,arr.length); 5 } 6 //2.调整堆结构+交换堆顶元素与末尾元素 7 for(int j=arr.length-1;j>0;j--){ 8 swap(arr,0,j);//将堆顶元素与末尾元素进行交换 9 adjustHeap(arr,0,j);//重新对堆进行调整 10 } 11 }
转载于:https://www.cnblogs.com/singular/p/10488604.html
【算法学习】堆排序建立最大堆相关推荐
- 算法学习(三)堆排序
要弄清楚堆排序,我们首先要懂得以下两点: 1)逻辑上的结构,怎么样才是一个堆. 2)存储上的结构,一个堆存储起来的结构是怎么样的. 一般来讲,堆排序中的"堆"指的是二叉堆,一种完全 ...
- 算法学习笔记17:堆、堆排序
目录 堆和堆排序:为什么说堆排序没有快速排序快 如何理解"堆" 如何实现一个堆 1. 往堆中插入一个元素 2. 删除堆顶元素 如何基于堆实现排序 1. 建堆 2. 排序 解答开篇 ...
- python堆排序算法_Python算法学习之堆和堆排序
什么是堆? 堆是一种完全二叉树(请你回顾下上一章的概念),有最大堆和最小堆两种.最大堆: 对于每个非叶子节点 V,V 的值都比它的两个孩子大,称为 最大堆特性(heap order property) ...
- python range倒序_Python算法学习之堆和堆排序
什么是堆? 堆是一种完全二叉树(请你回顾下上一章的概念),有最大堆和最小堆两种. 最大堆: 对于每个非叶子节点 V,V 的值都比它的两个孩子大,称为 最大堆特性(heap order property ...
- 好久没有看到这么有建设性德文章,由衷地赞叹《知其所以然地学习(以算法学习为例)》-By 刘未鹏(pongba)
知其所以然地学习(以算法学习为例) By 刘未鹏(pongba) C++的罗浮宫(http://blog.csdn.net/pongba) Updated(2008-7-24):更新见正文部分,有标注 ...
- 算法学习之快速排序的C语言实现
近几天在学习简单算法,今天看了一个快速排序和堆排序,堆排序还没搞懂,还是先把快速排序搞清楚吧 教程网上一艘一大堆,这里选择一个讲的比较通俗的的一个吧: http://blog.csdn.net/mor ...
- Java常见排序算法之堆排序
在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...
- java 堆排序算法_堆排序算法的讲解及Java版实现
这篇文章主要介绍了堆排序算法的讲解及Java版实现,堆排序基于堆这种数据结构,在本文中对堆的概念也有补充介绍,需要的朋友可以参考下 堆是数据结构中的一种重要结构,了解了"堆"的概念 ...
- 算法学习总结(2)——温故十大经典排序算法
一.什么是排序算法 1.1.排序定义 对一序列对象根据某个关键字进行排序. 1.2.排序术语 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面: 不稳定:如果a原本在b的前面,而a=b,排 ...
最新文章
- 各省市数据中心机房工程新建项目汇总(2021年)
- 【转】自然语言系列学习之表示学习与知识获取(一)分布式表示
- ubuntu10.04下audacious2.4源码编译过程(解决2.3cue的bug)
- Servlet使用适配器模式进行增删改查案例(BaseDaoUtilImpl.java)
- 从CLI监视OpenJDK
- 在屏幕上打印杨辉三角
- 我是如何一步步解决问题 让Spring MVC返回HTML类型的视图
- xps测试数据处理软件,XPS数据处理时 XPSpeaks 分峰拟合
- python基础之列表函数(10)
- 关于网络营销基本理论的概述
- 十大著名黑客——George Hotz
- 2021-04-29【已解决】The server cannot or will not process the request due to something that is perceived
- 关于android某些手机java.lang.UnsatisfiedLinkError: No implementation found for ......的问题
- 安装VS2019、MFC,并创建MFC工程文件,查看工程信息
- 85 R 银行信用卡风控评分数据分析
- 苏宁搭台品牌唱戏,净水市场将变天
- 金融专业本科生毕业论文选题推荐?
- [云原生专题-29]:K8S - 核心概念 - 名字空间/命名空间概念详解与主要操作案例
- 【C语言学习笔记】《C程序设计语言》读后感
- 纯靠成绩毫无科研的保研历程(电子信息工程专业)
热门文章
- 编写矩形类 计算矩形面积
- (转).net webconfig使用IConfigurationSectionHandler自定section
- 走进Java 7模块系统
- Go语言的Channel文章,整个人都感觉不好了
- 使用Remix编译和部署以太坊智能合约
- sql算术运算符_SQL运算符教程–按位,比较,算术和逻辑运算符查询示例
- 愉快的舞会c++_如何在5分钟内建立一个令人愉快的加载屏幕
- es6 generator_让我们探索一下ES6 Generators
- Hadoop集群搭建(六:HBase的安装配置)
- 怎样把字符1变成数字1