Сортировать по темам - PullRequest
1 голос
/ 12 января 2011

У меня есть назначение, и мне нужен рабочий код.Перед тем, как начать, я хочу понять проблему, но не могу понять, как ее написать.

У меня есть массив данных, возьмите это, например,

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

Мне нужно разделить этомассив пополам, бросить его в пул потоков и делать это рекурсивно, пока у меня не будет <= 2 элементов.Если у меня есть 2 элемента, мне нужно проверить, что меньше, и поместить его в левую часть, а затем вернуть массив. </p>

Что я не понимаю, так это как объединить массив?я должен разделить массив, бросить поток в пул и заблокировать, пока он не будет готов?Как я могу получить результаты потока?Я собираюсь предположить, что невозможно объединить массивы без блокировки?

Вот что у меня есть.

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

Примечание: Профессор сказал, что мы можем попросить других помочь,Я думаю, что могу решить это, не спрашивая, но я хочу получить лучший ответ.Потоки - моя слабость (я не делаю ничего другого, дБ, двоичный ввод, веб-интерфейс, просто никогда не сложные потоки)

Ответы [ 3 ]

2 голосов
/ 13 января 2011

Если добавить к ответу Мартина, я бы не стал создавать меньшие копии массива.Вместо этого я хотел бы, чтобы каждый поток работал на подмножестве исходного массива.

2 голосов
/ 13 января 2011

Похоже, это параллельная версия сортировка слиянием .Вы должны существенно заставить его работать как рекурсивная последовательная версия, но, очевидно, запускать каждую рекурсивную сортировку как отдельную задачу.

В вашем API задач должен быть какой-то способ ожидания завершения и, возможно, также передачи результатов,При этом вы можете достаточно хорошо скопировать традиционную сортировку слиянием: для каждой под-сортировки поместите задачу в пул и дождитесь завершения двух подзадач.Затем выполните объединение и передайте свой собственный результат в задачу обработки вызовов.

Если у вас есть только обычный API потоков (т.е. нет реальной библиотеки задач), то я предлагаю вам предоставить выходные данные в третьем массиве:каждый поток будет иметь два входных массива и один выходной массив.Если вам разрешено создавать новые потоки для каждой задачи, вы можете дождаться завершения задачи, соединив две подзадачи.

0 голосов
/ 13 января 2011
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...