我有一项任务,我需要工作代码。在开始之前,我想了解问题,但我无法弄清楚如何编写它。
我有一个数据数组,例如
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界面,只是从不复杂的线程)
答案 0 :(得分:2)
这似乎是merge sort的并行版本。你必须使它像递归顺序版本一样工作,但显然将每个递归排序作为一个单独的任务运行。
在你的任务API中,应该有一些方法可以等待完成,也许还可以传递结果。这样,您可以很好地复制传统的mergesort:对于每个子排序,将任务放入池中,并等待两个子任务的完成。然后执行合并,并将您自己的结果传回给您的调用任务。
如果你只有常规的线程API(即没有真正的任务库),那么我建议你在第三个数组中提供输出:每个线程将有两个输入数组和一个输出数组。如果允许为每个任务创建新线程,则可以通过连接两个子线程来等待任务完成。
答案 1 :(得分:2)
要添加到Martin的答案,我不会创建较小的数组副本。相反,我会让每个线程都在原始数组的子集上工作。
答案 2 :(得分:0)