繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM