Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 用线程排序_Multithreading_Sorting - Fatal编程技术网

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;
    }