[英]How to sort an array of M numbers using N threads in java?
我必须使用N(i = 1..N)线程对M个数组进行排序,每个线程开始从位置(N * i)%m对数组进行排序。 谁能帮助我?
你想要做的是分区数组,然后将数组的两半传递给另一个线程来进行处理。
说你有这个号码:
11 43 24 56 12 65 90 12 53 23
在一个线程中,您将对数字进行分区:
12 24 11 23 12 | 65 90 53 56 43
然后,您可以在不同的线程中对数组的每一半执行快速排序。
请允许我提供一些代码:
public void multiThreadSort(int threads, int[] arr, int start, int stop) {
if (threads > 1) {
int midpoint = partition(arr, start, stop);
new Thread(){public void run() {
multiThreadSort(threads - 1, arr, start, midpoint);
}}.start();
new Thread(){public void run() {
multiThreadSort(threads - 1, arr, midpoint, stop);
}}.start();
}
else
Arrays.sort(arr, start, stop);
}
public int partition(int[] arr, int start, int stop);
然后像这样调用它:
multiThreadSort(N, arr, 0, arr.length());
您可以让每个线程使用Arrays.sort(arr, fromIndex, toIndex)
对其自己的数组部分进行Arrays.sort(arr, fromIndex, toIndex)
并且在完成所有线程之后,只需使用合并排序来合并不同的结果。 (即使这一步也可以通过一次合并多个部分来并行化。)
这是一个相关的问题/好答案 。
另一个问题是你为什么要这样做? 线程创建和销毁相当繁重,排序(如果你可以将你的设置保留在内存中)相当快。 只有在线程池中由于某些其他原因而预先存在线程时才这样做,如果排序M的时间远远大于创建(并且可能是销毁)线程的时间,或者如果这是学习练习以学习线程操作(在这种情况下你不应该在这里问)。 如果排序M的时间大于创建线程的时间,那么您可能会将部分数组放在虚拟内存中,并且磁盘分页效果将主导您的性能。
对于某些算法,线程非常有用,甚至是必不可少的。 排序不是一个好的应用程序。 除此之外,如上所述,作为一种学习练习,可以获得在线程一起运行时编写软件的经验。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.