Различные порядки сортировки - разделяй и властвуй?

Я пытаюсь повторно -организовать список предметов по-разному. Здесь я буду использовать целые числа, но это может быть что угодно из этого списка.

В приведенном ниже примере кода 1,2,3,4,5,6,7,8 сортируются в следующем порядке: 1,8,2,7, 3,6,4,5

Итак, сначала. последний. второй. Второй до последнего и т. Д. Это может быть немного неуклюже, но оно работает.

Теперь я пытаюсь вывести список в другом порядке, чтобы он продолжал делиться на две части. Я думаю, что это можно назвать Divide and Conquer, но после попытки / просмотра некоторого рекурсивного кода сортировки и т. Д. Я не слишком понимаю, как это реализовать здесь.

Я надеюсь получить такие номера.

1,8,4,2,6,3,5,7

Первая, последняя, ​​половина, первая половина на полпути, вторая половина на полпути и т. Д.

Другими словами, я пытаюсь разделить набор чисел пополам ... Затем для каждой половины по очереди разделите их пополам. И так далее:

1 2 3 4 5 6 7 8
1                      (first item)
              8        (last item)
      4                (mid item)
  2                     (mid of first half) 
          6              (mid of second half)
    3                    (mid of 1st chunk)
        5                (mid of 2nd chunk)
           7             (mid of 3rd chunk)

Если бы кто-нибудь мог показать мне, как это сделать, на этом простом примере, это было бы действительно здорово.

 static void Main(string[] args)
    {

        List<int> numberlist = new List<int>();

        numberlist.Add(1);
        numberlist.Add(2);
        numberlist.Add(3);
        numberlist.Add(4);
        numberlist.Add(5);
        numberlist.Add(6);
        numberlist.Add(7);
        numberlist.Add(8);

        int rev = numberlist.Count-1;
        int fwd = 0;

        // order 1,8,2,7,3,6,4,5

        for (int re = 0; re < numberlist.Count; re++)
        {
            if (re % 2 == 0)
            {
                Console.WriteLine(numberlist[fwd]);
                fwd++;                       
            }
            else
            {
                Console.WriteLine(numberlist[rev]);
                rev--;
            }
        }
        Console.ReadLine();
    }

Еще несколько диапазонов выборки и вывода для чтения слева направо, сверху вниз:

1 2 3 4 5 6 7
1           7
      4
  2     5
    3     6

1 2 3 4 5 6 7 8 9 10 11 12
1                       12
          6 
    3           9 
  2   4     7     10
        5     8      11


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
1                                   16
              8 
      4                 12
  2       6       10          14
    3   5   7   9    11    13    15
6
задан double-beep 9 February 2019 в 18:37
поделиться