Merge Sort in Java2025年3月27日 | 阅读 6 分钟 归并排序与快速排序算法类似,因为它使用分治法来排序元素。它是最流行和最高效的排序算法之一。它将给定的列表分成相等的两半,对这两半分别调用自身,然后将这两个已排序的半合并。我们需要定义 merge() 函数来执行合并。在本节中,我们将讨论 Java 中归并排序的实现、分步排序、归并排序的复杂度、优点和缺点。 执行归并排序的步骤归并排序的完整执行过程遵循以下基本步骤:
此方法可确保元素被系统地比较和合并,从而减少与传统排序技术相比的操作次数。 ![]() 分治法归并排序算法使用分治法作为策略。它将一个问题分解为小的子问题或数组。执行排序后,合并已排序的数组以获得最终结果。该算法通过三个基本步骤实现。
递归算法具有高效率,并在所有情况下提供 O(n log n) 的时间复杂度。 归并排序的工作原理为了理解归并排序算法的工作原理,让我们看一个未排序的数组。假设数组的元素是: ![]() 根据归并排序算法,首先将给定的数组分成相等的两半。归并排序不断地将列表分成相等的几部分,直到无法进一步划分。 由于给定数组中有八个元素,因此它被分成两个大小为 4 的数组。 ![]() 再次,将这两个数组分成两半。由于它们的大小为 4,因此将它们分成大小为 2 的新数组。 ![]() 再次,划分这些数组以获得无法进一步划分的原子值。 ![]() 现在,以相同的方式将它们组合起来。 在组合时,首先比较每个数组的元素,然后将它们按排序顺序合并到另一个数组中。 因此,首先比较 12 和 31,它们都在排序位置。然后比较 25 和 8,在两个值的列表中,将 8 放在前面,然后是 25。然后比较 32 和 17,对它们进行排序,将 17 放在前面,然后是 32。之后,比较 40 和 42,并按顺序放置它们。 ![]() 在下一次组合迭代中,现在比较包含两个数据值的数组并将它们合并到一个数组中。这会得到两个已排序的数组。 ![]() 最后,合并完整的数组以获得最终的排序数组。 ![]() 现在,数组已完全排序。 算法在以下算法中,arr 是给定的数组,beg 是起始元素,end 是数组的最后一个元素。 归并排序的重要部分是 mergeSort 函数。此函数执行两个已排序的子数组 A[beg…mid] 和 A[mid+1…end] 的合并,以构建一个已排序的数组 A[beg…end]。因此,merge 函数的输入是 A[], beg, mid, 和 end。 Java 归并排序程序示例编译并运行输出 Sorted Array: 1 2 3 4 5 6 7 8 复杂度分析时间复杂度
空间复杂度归并排序的合并步骤需要额外的空间,因此在辅助空间方面为 O(n)。 归并排序的优点
归并排序的缺点
归并排序可确保效率但不是原地排序,而快速排序通常更快,但最坏情况下的场景是 O(n²)。 何时使用归并排序?归并排序最适合以下场景:
如果内存使用是一个问题,快速排序或堆排序可能是更好的选择。 结论归并排序是一种强大而高效的排序算法,可保证所有情况下的性能均为 O(n log n)。它广泛用于对大型数据集、链表和外部排序应用程序进行排序。尽管存在内存开销,但其稳定性和一致的性能使其成为排序操作中不可或缺的工具。 下一个主题Java 中向数组添加元素 |
Java 提供的位运算符之一是 XOR。XOR(也称为异或)将两个布尔操作数作为输入,如果它们不同则返回 true。当提供的两个布尔条件不能同时为 true 时,XOR 运算符是...
7 分钟阅读
在本文中,我们将找出它们是什么,以及在 Java 编程语言中使用它们的时间和地点。是什么?在编程上下文中,也称为 Java 虚拟机 (JVM) 协程。JVM 协程是用户模式线程...
阅读 3 分钟
main 方法是执行 Java 代码的起点。如果在运行时 JVM 找不到 main 方法,将抛出运行时异常。换句话说,如果 Java 代码中不存在 main 方法,JVM 将报告错误……
阅读 6 分钟
风筝图案是另一种复杂的图案程序,由于其编码复杂性,面试官很少问到。风筝基本上是三个三角形的组合。因此,我们将代码分解为三个部分,即上部、中部和下部。让我们来实现代码...
阅读 2 分钟
?在本节中,我们将创建一个 Java 程序,以根据日期获取星期几的名称。在处理 Java 中的日期和时间时,会用到以下类。Calendar 类:该类属于 java.util 包。它继承了 Object 类,并且...
阅读 4 分钟
在 Java 中,LinkedTransferQueue 是一个并发队列实现,它结合了传统阻塞队列和直接传递队列的特性。它实现了扩展了 BlockingQueue 类的 TransferQueue 接口,并通过... 扩展了生产者-消费者场景的功能。
14 分钟阅读
如何在 Java 中获取时间戳 时间戳是一系列字符或编码信息,用于标识某个事件发生的时间,通常给出日期和一天中的时间,有时精确到小数的某个分数。时间戳通常与计算机事件相关,但是...
阅读 3 分钟
java.nio.FloatBuffer 类的 rewind() 函数用于清除此缓冲区。此缓冲区使用 FloatBuffer 类返回。通过此过程,将位置重置为零,限制保持不变,并且所有先前指定的位置都将被清除。当一系列通道写入...
阅读 3 分钟
全栈开发人员是指能够开发应用程序后端和前端的人员。Java 全栈基本上是指使用 Java 开发整个技术栈的 Web 开发人员,被称为 Java 全栈开发人员。开发人员应具备以下技能...
阅读 8 分钟
java.nio.DoubleBuffer 具有 get() 函数。DoubleBuffer 类用于读取缓冲区当前位置的双精度值,然后递增该位置。语法:public abstract double get() 返回值:缓冲区当前位置的双精度值由...返回。
阅读 3 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India