我必须使用N(i = 1..N)个线程对M个数组进行排序,每个线程开始从位置(N * i)%m对数组进行排序。有谁可以帮助我?
答案 0 :(得分:3)
您要做的是使用divide and conquer之类的quick sort排序方法。
您要做的是对数组进行分区,然后将数组的两半传递给另一个线程进行处理。
说你有号码:
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());
答案 1 :(得分:1)
您可以让每个线程使用Arrays.sort(arr, fromIndex, toIndex)
对其自己的数组部分进行排序,并且在完成所有线程之后,只需使用合并排序来合并不同的结果。 (即使这一步也可以通过一次合并多个部分来并行化。)
答案 2 :(得分:0)
另一个问题是你为什么要这样做?线程创建和销毁相当繁重,排序(如果你可以将你的设置保留在内存中)相当快。只有在线程池中由于某些其他原因而预先存在线程时才这样做,如果排序M的时间远远大于创建(并且可能是销毁)线程的时间,或者如果这是学习练习以学习线程操作(在这种情况下你不应该在这里问)。如果排序M的时间大于创建线程的时间,那么您可能会将部分数组放在虚拟内存中,并且磁盘分页效果将主导您的性能。
对于某些算法,线程非常有用,甚至是必不可少的。排序不是一个好的应用程序。除此之外,如上所述,作为一种学习练习,可以让您的线程在一起运行时获得经验。