在C#中用四个线程合并排序?

时间:2015-04-06 12:52:57

标签: c# multithreading sorting threadpool mergesort

我想在C#中用四个线程编写一个合并排序程序。在这个程序中,每个线程都有一些在其线程中排序的数字。我将用一个例子来解释它们:第一个线程有100个数字。此线程使用合并排序对这些数字进行排序,然后将它们传递给第二个线程。第二个线程本身有100个数字,并使用从第一个线程传递的数字对其数字进行排序。在第二个线程中对数据进行排序之后,所有200个数字都传递给第三个线程以使用第三个线程的数字对这些数字进行排序,最后第四个线程中的所有数字都按照第四个线程的数字进行排序,并显示结果。我知道在这种情况下,简单的顺序排序方法可能比合并排序更快,但我必须以这种方式为我的学校项目进行排序,并且每个线程的这100个数字只是一个示例,在我的项目中每个线程都有超过100个数字。我想用四个线程对合并排序的数字进行排序。我特意在线程之间传递数字时遇到问题。我是C#的初学者,如果有可能请帮我一个代码。感谢。

2 个答案:

答案 0 :(得分:1)

从您解释的场景中,它似乎是一个顺序过程。一个线程等待其他线程的结果。

但我想如果你真的想要使用4个线程对100个数字进行排序,那么将25个数字传递给每个线程并在每个线程上调用merge排序。 当每个线程完成排序时,在第一次迭代结束时,您有4个排序的数组。现在将2个排序数组传递给每个线程,并在每个线程上调用合并排序的 MERGE 。 (在此阶段,您只使用2个线程)。 完成此合并后,您将获得2个排序数组。 您只需将2个排序数组传递给任何线程并调用MERGE(不合并排序)。

我认为如果你努力学习,你将获得在线解决方案。 http://penguin.ewu.edu/~trolfe/ParallelMerge/ParallelMerge.html

答案 1 :(得分:0)

并行合并排序不一定比简单的顺序排序方法快。只有在您需要对大量项目进行排序时(通常远远超过64K L1处理器高速缓存,即数万个4字节整数),您才拥有专用内核并能够通过这些内核对数据进行分区,你会开始看到任何好处。对于少量数据,由于需要额外的协调和分配,并行方法实际上会更慢。

在C#中有内置方法来执行此类分区。 PLINQ专门为此类任务而创建。

有几篇现有文章/博客文章讨论使用PLINQ解决并行合并排序,可以通过Google搜索“plinq merge sort”找到。

两个特别提供一些深度覆盖,包括一些基准测试与顺序排序可以在这里找到:

http://blogs.msdn.com/b/pfxteam/archive/2011/06/07/10171827.aspx http://dzmitryhuba.blogspot.nl/2010/10/parallel-merge-sort.html