Multithreading 用线程排序
我有一个任务,我需要工作代码。在我开始之前,我想理解这个问题,但我不知道怎么写 我有一个数据数组,以这个为例Multithreading 用线程排序,multithreading,sorting,Multithreading,Sorting,我有一个任务,我需要工作代码。在我开始之前,我想理解这个问题,但我不知道怎么写 我有一个数据数组,以这个为例 var arr = new byte[] {5,3,1,7,8,5,3,2,6,7,9,3,2,4,2,1} 我需要将这个数组一分为二,把它放到线程池中,然后递归地执行该操作,直到我看到这似乎是的并行版本。您应该使它像递归顺序版本一样工作,但显然要将每个递归排序作为单独的任务运行 在您的任务API中,应该有某种方法等待完成,也许还可以传递结果。这样,您就可以很好地复制传统的merges
var arr = new byte[] {5,3,1,7,8,5,3,2,6,7,9,3,2,4,2,1}
我需要将这个数组一分为二,把它放到线程池中,然后递归地执行该操作,直到我看到这似乎是的并行版本。您应该使它像递归顺序版本一样工作,但显然要将每个递归排序作为单独的任务运行 在您的任务API中,应该有某种方法等待完成,也许还可以传递结果。这样,您就可以很好地复制传统的mergesort:对于每个子排序,将一个任务放入池中,然后等待两个子任务完成。然后执行合并,并将自己的结果传递回调用任务
如果您只有一个常规的线程API,即没有真正的任务库,那么我建议您在第三个数组中提供输出:每个线程将有两个输入数组和一个输出数组。如果允许为每个任务创建新线程,则可以通过连接两个子线程来等待任务完成。这似乎是的并行版本。您应该使它像递归顺序版本一样工作,但显然要将每个递归排序作为单独的任务运行 在您的任务API中,应该有某种方法等待完成,也许还可以传递结果。这样,您就可以很好地复制传统的mergesort:对于每个子排序,将一个任务放入池中,然后等待两个子任务完成。然后执行合并,并将自己的结果传递回调用任务
如果您只有一个常规的线程API,即没有真正的任务库,那么我建议您在第三个数组中提供输出:每个线程将有两个输入数组和一个输出数组。如果允许为每个任务创建新线程,则可以通过连接两个子线程来等待任务完成。要补充Martin的答案,我不会创建更小的数组副本。相反,我会让每个线程处理原始数组的一个子集。为了补充Martin的答案,我不会创建更小的数组副本。相反,我会让每个线程处理原始数组的一个子集。非常乐意:非常乐意:你知道任何排序算法吗?你认为哪些是可以并行执行的?你尝试过网络搜索吗?“为什么在有算法之前要有代码?”大卫·赫弗纳。1我以前是,在HS。我什么都不知道/不记得了。3是的4从我的理解,我要学习线程,所以我要使用这个算法。我认为在你解决这个问题之前,你需要学习如何进行网络搜索。搜索并行排序将获得大量信息。你知道任何排序算法吗?你认为哪些是可以并行执行的?你尝试过网络搜索吗?“为什么在有算法之前要有代码?”大卫·赫弗纳。1我以前是,在HS。我什么都不知道/不记得了。3是的4从我的理解,我要学习线程,所以我要使用这个算法。我认为在你解决这个问题之前,你需要学习如何进行网络搜索。搜索并行排序将获得大量信息。考虑到这一点,我可以毫无问题地修改数组+1.考虑到这一点,我可以毫无问题地修改数组+1.
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;
}