热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

堆排序递归和非递归

在了解堆排序之前,基本的二叉树的概念是需要知道的完全二叉树:叶子节点在最后一层或者次一层,且节点从左往右连续大根堆:任何

在了解堆排序之前,基本的二叉树的概念是需要知道的


完全二叉树:叶子节点在最后一层或者次一层,且节点从左往右连续

大根堆:任何根节点都比他的左右子节点都要大

i为节点在数组中的索引,求节点的父节点:(i - 1) / 2, 求节点的左节点 i * 2 + 1,求节点的右节点 i * 2 + 2

在构建一个堆之前,我们需要先把他们的左右节点构建成堆,所以我们从下往上依次构建堆,由于叶子节点是没有子节点的,所以从最后一个节点的父节点开始构建,想画个个图,可是实力实在不允许那就都放在代码中吧,老铁干了这段代码,先写递归的吧,递归毕竟理解起来简单。

//测试方法&#64;Testpublic void test() {int size &#61; 50;int[] array &#61; new int[size];for (int i &#61; 0; i < size; i&#43;&#43;) {array[i] &#61; (int) (Math.random() * 100);}heapify2(array);System.out.println(Arrays.toString(array));}//堆排public void heapify2(int[] array) {if (array &#61;&#61; null || array.length < 2) {return;}//最后一个节点的父节点int parentNode &#61; (array.length - 2) / 2;//进行堆排for (int i &#61; parentNode; i >&#61; 0; i--) {sift2(array, i, array.length - 1);}//交换最后一个数和第一个数,交换后最大的数到最后&#xff0c;下次堆排的时候&#xff0c;最后一个数就不许算进去了for (int i &#61; array.length - 1; i > 0 ; i--) {swap(array, 0, i);sift2(array, 0, i - 1);}}/*** &#64;Description 递归写法*/public void sift2(int[] array, int currentNode, int length) {//左节点int left &#61; currentNode * 2 &#43; 1;//右节点int right &#61; currentNode * 2 &#43; 2;//如果左右节点有比当前节点要大的节点&#xff0c;后面是需要以这个节点进行堆排的int max &#61; currentNode;//左节点不能超过数组的最大索引if (left <&#61; length && array[left] > array[max]) {max &#61; left;}if (right <&#61; length && array[right] > array[max]) {max &#61; right;}//如果发生交换&#xff0c;我们就需要进行堆排了if (max !&#61; currentNode) {swap(array, max, currentNode);//由于max指向的索引是最大的&#xff0c;和currentNode交换后&#xff0c;max现在指向的值就是currentNode的值了sift2(array, max, length);}}

最主要的就是这个sift,通过不断交换&#xff0c;来达到大根堆的效果&#xff0c;接着就是非递归的写法&#xff0c;其实和递归的思想一样&#xff0c;我们交换后就以交换的节点来进行堆排

/*** &#64;Description 非递归写法*/public void sift1(int[] array, int currentNode, int length) {//这个tmp就是当前需要堆排的节点&#xff0c;如果交换了&#xff0c;我们就让这个tmp等于交换的位置&#xff0c;来达到往下移一层int tmp &#61; currentNode;//左节点int j &#61; currentNode * 2 &#43; 1;while (j <&#61; length) {//比较左右大小if (j &#43; 1 <&#61; length && array[j &#43; 1] > array[j]) {j &#61; j &#43; 1;}//由于左右已经进行比较了&#xff0c;所以我们只要于最大的比较if (array[tmp] < array[j]) {swap(array, tmp, j);//tmp往下移一层&#xff0c;tmp变成下一次需要堆排的节点tmp &#61; j;//j接着等于需要堆排的左节点j &#61; tmp * 2 &#43; 1;} else {break;}}}

推荐阅读
  • Spring Boot 中配置全局文件上传路径并实现文件上传功能
    本文介绍如何在 Spring Boot 项目中配置全局文件上传路径,并通过读取配置项实现文件上传功能。通过这种方式,可以更好地管理和维护文件路径。 ... [详细]
  • Ihavetwomethodsofgeneratingmdistinctrandomnumbersintherange[0..n-1]我有两种方法在范围[0.n-1]中生 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 本文详细解析了客户端与服务器之间的交互过程,重点介绍了Socket通信机制。IP地址由32位的4个8位二进制数组成,分为网络地址和主机地址两部分。通过使用 `ipconfig /all` 命令,用户可以查看详细的IP配置信息。此外,文章还介绍了如何使用 `ping` 命令测试网络连通性,例如 `ping 127.0.0.1` 可以检测本机网络是否正常。这些技术细节对于理解网络通信的基本原理具有重要意义。 ... [详细]
  • 分享一款基于Java开发的经典贪吃蛇游戏实现
    本文介绍了一款使用Java语言开发的经典贪吃蛇游戏的实现。游戏主要由两个核心类组成:`GameFrame` 和 `GamePanel`。`GameFrame` 类负责设置游戏窗口的标题、关闭按钮以及是否允许调整窗口大小,并初始化数据模型以支持绘制操作。`GamePanel` 类则负责管理游戏中的蛇和苹果的逻辑与渲染,确保游戏的流畅运行和良好的用户体验。 ... [详细]
  • 本文介绍了UUID(通用唯一标识符)的概念及其在JavaScript中生成Java兼容UUID的代码实现与优化技巧。UUID是一个128位的唯一标识符,广泛应用于分布式系统中以确保唯一性。文章详细探讨了如何利用JavaScript生成符合Java标准的UUID,并提供了多种优化方法,以提高生成效率和兼容性。 ... [详细]
  • 本文探讨了基于点集估算图像区域的Alpha形状算法在Python中的应用。通过改进传统的Delaunay三角剖分方法,该算法能够生成更加灵活和精确的形状轮廓,避免了单纯使用Delaunay三角剖分时可能出现的过大三角形问题。这种“模糊Delaunay三角剖分”技术不仅提高了形状的准确性,还增强了对复杂图像区域的适应能力。 ... [详细]
  • 本文详细介绍了Java反射机制的基本概念、获取Class对象的方法、反射的主要功能及其在实际开发中的应用。通过具体示例,帮助读者更好地理解和使用Java反射。 ... [详细]
  • javax.mail.search.BodyTerm.matchPart()方法的使用及代码示例 ... [详细]
  • C语言中全部可用的数学函数有哪些?2.longlabs(longn);求长整型数的绝对值。3.doublefabs(doublex);求实数的绝对值。4.doublefloor(d ... [详细]
  • 本文详细探讨了使用纯JavaScript开发经典贪吃蛇游戏的技术细节和实现方法。通过具体的代码示例,深入解析了游戏逻辑、动画效果及用户交互的实现过程,为开发者提供了宝贵的参考和实践经验。 ... [详细]
  • 在处理大图片时,PHP 常常会遇到内存溢出的问题。为了避免这种情况,建议避免使用 `setImageBitmap`、`setImageResource` 或 `BitmapFactory.decodeResource` 等方法直接加载大图。这些函数在处理大图片时会消耗大量内存,导致应用崩溃。推荐采用分块处理、图像压缩和缓存机制等策略,以优化内存使用并提高处理效率。此外,可以考虑使用第三方库如 ImageMagick 或 GD 库来处理大图片,这些库提供了更高效的内存管理和图像处理功能。 ... [详细]
  • 揭秘腾讯云CynosDB计算层设计优化背后的不为人知的故事与技术细节
    揭秘腾讯云CynosDB计算层设计优化背后的不为人知的故事与技术细节 ... [详细]
  • 本文深入探讨了RecyclerView的缓存与视图复用机制,详细解析了不同类型的缓存及其功能。首先,介绍了屏幕内ViewHolder的Scrap缓存,这是一种最轻量级的缓存方式,旨在提高滚动性能并减少不必要的视图创建。通过分析其设计原理,揭示了Scrap缓存为何能有效提升用户体验。此外,还讨论了其他类型的缓存机制,如RecycledViewPool和ViewCacheExtension,进一步优化了视图复用效率。 ... [详细]
  • JVM参数设置与命令行工具详解
    JVM参数配置与命令行工具的深入解析旨在优化系统性能,通过合理设置JVM参数,确保在高吞吐量的前提下,有效减少垃圾回收(GC)的频率,进而降低系统停顿时间,提升服务的稳定性和响应速度。此外,本文还将详细介绍常用的JVM命令行工具,帮助开发者更好地监控和调优JVM运行状态。 ... [详细]
author-avatar
理想压力正比_635
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有