Heap Sort in Java2025年4月2日 | 阅读9分钟 堆排序使用一种基于比较的算法,该算法将输入数组视为一个堆。堆通常是最大堆(二叉堆)。堆排序可以看作是选择排序的一种优化。 堆排序算法的工作原理让我们举个例子来理解堆排序的工作原理。 步骤1:将输入数组视为二叉树。我们已将a[] = {19, 4, 13, 18, 10, 12, 15}作为输入数组。 ![]() 根节点位于索引0。任何位于i索引的根节点的左子节点和右子节点分别位于索引(2 * i + 1)和(2 * i + 2)。上面的图例说明了这一点。 步骤2:应用heapify()将其转换为最大堆。它将重新排列输入数组的元素以模拟最大堆。 ![]() 步骤3:现在,将根元素与堆的最后一个元素进行交换。请注意,元素19已在其在已排序数组中的正确位置。因此,将堆大小减1。 ![]() 步骤4:观察到当前堆不遵循最大堆的属性。因此,再次应用heapify()来重新排列元素以形成最大堆。 ![]() 步骤5:将堆的最后一个元素与堆的最高元素进行交换。我们将得到已排序数组的倒数第二个元素放置在倒数第二个位置。因此,堆的大小也将减1。 ![]() 步骤6:再次应用heapify()以重新排列元素以遵循最大堆的属性。 ![]() 步骤7:再次,将最后一个元素与堆的最高元素进行交换。我们将得到已排序数组的倒数第三个元素。 ![]() 步骤8:对堆中的剩余元素应用heapify()。 ![]() 步骤9:对堆的最高元素和最后一个元素进行交换。此时,我们已对数组的最后4个元素进行了排序。 ![]() 步骤10:应用heapify()再次重新排列元素以遵循最大堆。 ![]() 步骤11:应用堆的最高元素和最后一个元素的交换。此时,堆中仅剩最后两个元素需要排序。 ![]() 步骤12:应用heapify()然后进行元素的交换,我们将得到所需的结果。 ![]() 使用递归实现算法根据算法,以下代码是使用递归编写的。 示例编译并运行输出 The array before sorting is: 19 4 13 18 10 12 15 The array after sorting is: 4 10 12 13 15 18 19 解释 Heapify函数:递归地确保给定索引处的子树满足最大堆属性。如果检测到违反(子节点大于父节点),则会发生交换,并且受影响的子树将递归地进行堆化。 堆排序函数:首先,通过对每个非叶节点调用heapify()函数来构建一个最大堆。然后,将最大元素(根节点)与最后一个元素交换,并减小堆大小。 复杂度分析 时间复杂度为O(n*log (n)),其中n是输入数组中的元素总数。空间复杂度为O(1)。这是因为代码中使用了递归,而递归使用了递归调用堆栈。 使用迭代实现堆排序算法在以下程序中,我们使用了迭代而不是递归。因此,不会使用额外的空间(递归调用堆栈)。 示例编译并运行输出 Unsorted array: 19 4 13 18 10 12 15 Sorted array: 4 10 12 13 15 18 19 复杂度分析 在上面的程序中,createMaxHeap()和heapsort()方法需要n*log(n)的时间。因此,总时间复杂度为O(n * log(n)),其中n是输入数组中的元素总数。空间复杂度为O(1)。 堆排序的优点有效的时间复杂度:在所有情况下,堆排序的时间复杂度均为(n * log(n)),其中n是输入元素的总数。log n因子是由于二叉堆的高度,它确保了即使有大量元素,这种排序的整体性能也很好。 内存使用:堆排序使用最少的空间(可以通过迭代而不是递归编写heapify()方法来实现)。它只需要空间来保存需要排序的项目;除此之外,不需要其他空间。 堆排序的缺点不稳定:堆排序会重新排列相对顺序。因此,使其不稳定。观察上面代码中元素的交换。 昂贵:与归并排序相比,堆排序中使用的常数的成本更高,尽管两者的时间复杂度均为O(n*log(n)。 效率低下:由于时间复杂度中的常数较高,因此堆排序的效率不高。 堆排序常见问题解答问)讨论堆排序的两个阶段。 答)堆排序的第一阶段是将输入数组转换为最大堆。堆排序的第二阶段是从堆中删除根元素,然后对剩余元素进行heapfiy()以生成新的最大堆。 问)应该使用哪种排序技术 - 堆排序还是归并排序? 答)如果我们比较时间复杂度,我们会发现归并排序比堆排序在排序元素方面稍快。但是,与堆排序相比,归并排序占用的空间更多。因此,选择哪种排序技术主要取决于需求。 问)为什么堆排序比选择排序更好? 答)与选择排序类似,堆排序会查找最大元素。然而,堆排序查找最大元素的技术比选择排序更好。这种优势是由于在堆排序中使用堆数据结构来查找最大元素。 下一个主题Java中的数字排列 |
JFileChooser 是 java Swing 包中的一个类。java Swing 包对于 JavaTM Foundation Classes (JFC) 至关重要。JFileChooser 包含许多有助于在 Java 中构建图形用户界面的元素。Java Swing 提供按钮、面板、对话框等组件。JFileChooser...
5 分钟阅读
在 Java 中,可以使用数组、集合、包装类或自定义类返回多个值。使用自定义类可以提高可读性、类型安全性和结构化数据处理。使用 Pair(两个值)返回不同类型的多个值 代码使用自定义类 Result 来存储和...
7 分钟阅读
线程安全是指程序或数据结构的一个属性,它确保多个线程可以访问和修改数据而不会导致不正确的结果。简单来说,线程安全的集合是多个线程可以访问或更改而不会引起问题的集合。...
7 分钟阅读
Java 中的构造函数 Java 中的构造函数类似于方法,但有几处不同。构造函数与类名相同。构造函数没有返回类型。如果 Java 程序中尚未定义构造函数,Java 程序会自动创建一个...
阅读 4 分钟
Java 中的魔术数字 程序 在编程中,魔术数字是指直接在代码中使用的、未经明确定义或解释的硬编码数字或字符串值。它以后可能会更改。它用于标识目的。它似乎是任意的,没有上下文或...
7 分钟阅读
在本节中,我们将讨论什么是费马数,并创建 Java 程序来检查给定数字是否是费马数。费马数程序经常在 Java 编码面试和学术界中出现。费马数 由 Pierre de...首次研究
阅读 3 分钟
这是 Google、Amazon、TCS、Accenture 等顶级 IT 公司面试中经常遇到的一个问题。通过解决这个问题,人们希望检查应聘者的逻辑能力、批判性思维和解决问题的能力。因此,在本节中,我们将...
阅读 3 分钟
Java 社区流程 (JCP) 是开发和演进 Java 编程语言及其相关技术的关键机制。自 1998 年成立以来,JCP 在保持 Java 在快速发展的软件开发世界中的相关性和适应性方面发挥了至关重要的作用。在……
阅读 6 分钟
java.text.ChoiceFormat 是一个包含 applyPattern() 函数的类。使用 ChoiceFormat 类,可以覆盖当前的限制和格式,以设置 ChoiceFormat 的新模式文本。ChoiceFormat 格式和限制的组合将是这个新模式。语法:public...
阅读 3 分钟
在本节中,我们将讨论如何创建用于购物账单的 Java 程序。要生成购物账单,我们需要产品 ID、名称、数量、单价和产品的总价,以及总计金额。除了产品详细信息外,我们还可以添加……
阅读 12 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India