java - Java 中的并发排序

标签 java sorting concurrency

我目前正在开发一个程序来同时对字符串进行排序。我的程序接收一个文件,将文件的每一行读入一个数组,然后将字符串数组拆分为更小的字符串数组。然后程序为每个较小的数组启动一个线程,并对它们进行快速排序。一旦每个线程完成对其数组的排序,主线程就会从线程对象中收集所有结果。然后应该将较小的、现已排序的数组合并为一个大的、排序的数组。

我知道我的快速排序实现有效——程序使用一个线程对单词进行排序。我需要的是一种将线程返回的数组嵌套在一起的算法。

感谢任何帮助 - 提前致谢。

最佳答案

mergesort 的最后一个merge 过程开始.您读取每个 m 数组的第一个值(单个子数组的最小值),然后选择 m 读取值中的最小值(全局最小值),将其插入结果并将其从包含数组中删除或递增各自的指数加一。然后,迭代直到所有子数组都为空,或者所有索引都到达各自数组的末尾。

注意:如果你有一个非常大的数据集(它实际上用于处理这种情况),这可能会减少内存使用,但由于拆分成本(如果你复制子数组,它会变成线性) 和多线程开销。考虑到当应用于大型数组时,inplace Mergesort 更节省空间。还要考虑一下,您正在使用的快速排序的编写者可能花时间优化调用和分支执行。

这是基本的理论 CS,但请注意,您不能简单地通过使用并行来降低计算复杂度等级,您只能获得线性加速。最后,Quicksort 碰巧达到了比较排序算法的平均复杂度的下限:如果你想超越 Quicksort O(nlog(n)) 我有个坏消息要告诉你。

关于java - Java 中的并发排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16398338/

相关文章:

java - 将 int 转换为字节数组并使用 System.out.write 方法打印到控制台

java-connector.so 找不到

路径中带有特殊字符的Java ClassLoader getResource

MySQL - 按 ID 自动排序不起作用

javascript - Scriptaculous 排序矩阵

java - 我如何分析约 13GB 的数据?

sorting - boost 弹性聚集结果

java - 如何使用 WatchService 停止用于监视文件夹的线程?

.net - .Net Framework 中的哪个线程安全集合将 “Contains” 作为其 API 之一?

java - 在 Java 中原子读取然后写入 ByteBuffer 的一部分