用线程排序

时间:2011-01-12 20:45:44

标签: multithreading sorting

我有一项任务,我需要工作代码。在开始之前,我想了解问题,但我无法弄清楚如何编写它。

我有一个数据数组,例如

var arr = new byte[] {5,3,1,7,8,5,3,2,6,7,9,3,2,4,2,1}

我需要将这个数组分成两半,将它抛入一个线程池并递归执行,直到我有< = 2个元素。如果我有2个元素我需要检查哪个更少并将其放在左侧然后返回数组。

我不明白的是我如何合并阵列?我想分裂数组,将一个线程扔进池中并阻塞直到它准备好了?我如何得到线程的结果?我将假设它不可能在没有阻塞的情况下合并数组?

到目前为止我所拥有的。

    static void Main(string[] args)
    {
        var arr = new byte[] { 5, 3, 1, 7, 8, 5, 3, 2, 6, 7, 9, 3, 2, 4, 2, 1 };
        var newarr = Sort(arr);
        Console.Write(BitConverter.ToString(newarr));
    }
    static byte[] Sort(byte[] arr)
    {
        if (arr.Length <= 2)
            return arr;
        if (arr.Length == 2)
        {
            if (arr[0] > arr[1])
            {
                var t = arr[0];
                arr[0] = arr[1];
                arr[1] = t;
            }
            return arr;
        }

        var arr1 = arr.Take(arr.Length / 2).ToArray();
        var arr2 = arr.Skip(arr1.Count()).ToArray();
        //??
        return arr;
    }

注意:教授确实说我们可以向别人寻求帮助。我想我可以解决这个问题,但我想得到最好的答案。线程是我的弱点(我没有别的,db,二进制io,web界面,只是从不复杂的线程)

3 个答案:

答案 0 :(得分:2)

这似乎是merge sort的并行版本。你必须使它像递归顺序版本一样工作,但显然将每个递归排序作为一个单独的任务运行。

在你的任务API中,应该有一些方法可以等待完成,也许还可以传递结果。这样,您可以很好地复制传统的mergesort:对于每个子排序,将任务放入池中,并等待两个子任务的完成。然后执行合并,并将您自己的结果传回给您的调用任务。

如果你只有常规的线程API(即没有真正的任务库),那么我建议你在第三个数组中提供输出:每个线程将有两个输入数组和一个输出数组。如果允许为每个任务创建新线程,则可以通过连接两个子线程来等待任务完成。

答案 1 :(得分:2)

要添加到Martin的答案,我不会创建较小的数组副本。相反,我会让每个线程都在原始数组的子集上工作。

答案 2 :(得分:0)