如何在java中使用N个线程对M个数组进行排序?

时间:2010-10-28 19:43:40

标签: java multithreading sorting

我必须使用N(i = 1..N)个线程对M个数组进行排序,每个线程开始从位置(N * i)%m对数组进行排序。有谁可以帮助我?

3 个答案:

答案 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)对其自己的数组部分进行排序,并且在完成所有线程之后,只需使用合并排序来合并不同的结果。 (即使这一步也可以通过一次合并多个部分来并行化。)

这是related question / good answer

答案 2 :(得分:0)

另一个问题是你为什么要这样做?线程创建和销毁相当繁重,排序(如果你可以将你的设置保留在内存中)相当快。只有在线程池中由于某些其他原因而预先存在线程时才这样做,如果排序M的时间远远大于创建(并且可能是销毁)线程的时间,或者如果这是学习练习以学习线程操作(在这种情况下你不应该在这里问)。如果排序M的时间大于创建线程的时间,那么您可能会将部分数组放在虚拟内存中,并且磁盘分页效果将主导您的性能。

对于某些算法,线程非常有用,甚至是必不可少的。排序不是一个好的应用程序。除此之外,如上所述,作为一种学习练习,可以让您的线程在一起运行时获得经验。