Java 中使用多线程进行归并排序2025 年 4 月 7 日 | 阅读 4 分钟 归并排序是一种流行的排序算法,通过将数组或列表划分为更小的子数组,对它们进行独立排序,然后将它们重新合并,从而有效地对其进行排序。它以其有效性、稳定性和处理大型数据集的能力而闻名。通过在 Java 中使用多线程,我们可以将工作负载分配给多个线程并并行执行它们,从而提高归并排序的性能。 Java 的多线程功能允许在单个程序中执行多个线程,每个线程代表一个独立的代码执行流。通过使用多个线程,我们可以利用可用的处理能力来加速排序操作。多线程归并排序的基本思想是将输入数组分成更小的块,并将每个块分配给自己的线程进行排序。一旦各个部分被排序,我们就将它们合并起来以获得最终排序的数组。 示例输入 {9, 2, 5, 1, 7, 4, 8, 3, 6, 11, 15, 12, 13, 10, 14} 输出 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15] 算法步骤 1:创建一个名为 MultithreadedMergeSort 的类,其中包含私有实例变量 array 和 tempArray,类型为 int[]。 步骤 2:在 MultithreadedMergeSort 类中实现一个公共方法 sort(int[] inputArray)。此方法将负责启动排序过程。 步骤 3:在 sort() 方法中 步骤 3.1:将 inputArray 分配给 array 实例变量。 步骤 3.2:将 tempArray 的长度初始化为与 inputArray 相同。 步骤 4:在 MultithreadedMergeSort 类中实现一个私有方法 mergeSort(int low, int high)。此方法将使用递归处理实际的排序过程。 步骤 5:在 mergeSort() 方法中 步骤 5.1:检查 low 是否小于 high,以确保当前子数组包含多个元素。 步骤 5.2:将 mid 索引计算为 low 和 high 的平均值。 步骤 6:使用 Thread 类和 lambda 表达式创建两个独立的线程来排序子数组的左半部分和右半部分。 步骤 6.1:创建一个 leftThread,它为左半部分递归调用 mergeSort(),并将 low 和 mid 作为参数传递。 步骤 6.2:创建一个 rightThread,它为右半部分递归调用 mergeSort(),并将 mid + 1 和 high 作为参数传递。 步骤 7:使用 start() 方法启动这两个线程。 步骤 8:在两个线程上使用 join() 方法,等待它们完成,然后再继续。 步骤 9:线程完成后,调用 merge() 方法合并已排序的部分。 步骤 10:在 MultithreadedMergeSort 类中实现一个私有方法 merge(int low, int mid, int high)。此方法将两个已排序的部分合并回原始数组。 步骤 11:在 merge() 方法中 步骤 11.1:使用 System.arraycopy() 将两个部分复制到临时数组中。 步骤 11.2:将 leftIndex 初始化为 low,将 rightIndex 初始化为 mid + 1,将 currentIndex 初始化为 low。 步骤 11.3:比较两个部分中的元素,并将它们按升序合并回原始数组。 步骤 11.4:如果还有剩余元素,则将左半部分或右半部分的剩余元素复制过来。 步骤 12:在 main() 方法中 步骤 12.1:创建 MultithreadedMergeSort 的一个实例。 步骤 12.2:声明并初始化一个输入数组。 步骤 12.3:在 MultithreadedMergeSort 实例上调用 sort() 方法,并将输入数组传递给它。 步骤 12.4:使用 Arrays.toString() 打印排序后的数组。 实施上述步骤的实现如下 文件名: MultithreadedMergeSort.java 输出 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15] 复杂度分析多线程归并排序的时间复杂度与常规归并排序算法相同,即 O(n log n),其中“n”是输入数组中的元素数量。 多线程归并排序的空间复杂度为 O(n),其中“n”是输入数组中的元素数量。 |
可以使用深度优先搜索 (DFS) 来遍历图或树结构,以查看沿路径累积的字符串是否会形成回文。回文是指正反读都相同的序列。应用 DFS 使我们能够构建字符串,探索...
阅读 15 分钟
给出了一个正数数组 inArr。任务是找出输入数组中存在的所有子序列中,不同的GCD(最大公约数)的数量。注意,子序列是由...
5 分钟阅读
在一个系统中,有两个单链表。由于某种错误,其中一个链表的最后一个节点链接到了第二个链表。因此创建了一个 Y 形链表。我们的任务是找出给定...
阅读 13 分钟
情侣派对问题是一个常被讨论的编程问题,其中程序员有一个由数组中的整数表示的人群。在这个人群中,每个人似乎都出现了两次,只有一个特殊的例外人士,他出现了...
阅读 6 分钟
Java IntSummaryStatistics 类的 getMin() 函数用于确定此 IntSummaryStatistics 中的最小记录数。语法:public int getMin() 参数:此方法不接受任何参数。返回值:返回此 IntSummaryStatistics 中的最小记录数……
阅读 2 分钟
Java 是一种灵活且流行的编程语言,基于面向对象编程 (OOP) 的思想。Java 中的一切都是对象,对象在其生命周期中会经历许多阶段。为了确保正确的资源管理和程序运行,Java 开发人员需要……
阅读 4 分钟
在 Java 编程世界中,接口在定义契约和建立类之间的通信方面起着至关重要的作用。通常,接口用于声明一组方法,实现类必须遵循这些方法。然而,Java 也允许创建没有...
阅读 4 分钟
在数字娱乐领域,游戏一直占据着特殊的位置,以其身临其境的体验和引人入胜的游戏玩法吸引着观众。在无数游戏的开发中扮演重要角色的技术之一是 Java。Java 以其多功能性、可移植性和丰富的库而闻名...
阅读 4 分钟
Kruskal算法是用于最小生成树的另一个最重要算法。MST是权重小于或等于每棵生成树权重的生成树。Java中的Kruskal算法接受一个连通的无向图并返回最小生成树...
阅读 3 分钟
Java 是一种多功能且流行的编程语言,提供了广泛的工具和数据结构来帮助开发人员创建高效、可靠且线程安全的应用程序。Java 并发框架中的一个此类工具是 Atomic Boolean。在本节中,我们将探讨什么是 Atomic...
阅读 16 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India