Необходимая формула: Сортировать массив в массив- "зигзаг" - PullRequest
5 голосов
/ 17 марта 2010

У меня есть следующий массив:

a = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]

Я использую его для некоторых визуальных вещей, таких как:

1   2  3  4<br/>
5   6  7  8<br/>
9  10 11 12<br/>
13 14 15 16<br/>

Теперь я хочу отсортировать массив таким образом, чтобы иметь «зигзаг» при рендеринге позже.

// rearrange the array according to this schema
1  3  6 10

2  5  9 13

4  8 12 15

7 11 14 16

// the original array should look like this:

a = [1,5,2,9,6,3,13,10,7,4,14,11,8,15,12,16]
// the second index to draw should be the first index in the second row,
// which is represent by 5 in the original 1D Array

Да, сейчас я ищу умную формулу, чтобы сделать это

ticker = 0;
rows = 4; // can be n
cols = 4; // can be n
originalArray = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16];
newArray = [];

while(ticker < originalArray.length)
{
    //do the magic here
    ticker++;
}

Ответы [ 2 ]

1 голос
/ 17 марта 2010

Посмотрите на структуру вашей матрицы:

1    3
|  / /
| / / 
|/ /  ...
2 /  5 
 / /    
/ /
4

1-й ряд начинается с 1

2-й ряд начинается с 2 = 1 + 1 (# элементов в 1-м повороте)

3-й ряд начинается с 4 = 1 + 1 (# элементов в первом зиге) + 2 (# элементов во втором зиге)

...

3-й ряд заканчивается в 6 = начало 3-го ряда + номер строки = 4 + 3 = 7

Вы можете получить формулу закрытой формы для i -ой строки и продолжить.

1 голос
/ 17 марта 2010

Вы можете оставить его отсортированным в исходном порядке, вам просто нужно пройти по-другому. EDIT : Оказывается, моя наивная реализация не учитывала различный размер шага в зависимости от диагонали. Код ниже делает и был протестирован в C #.

 var diagonals = new [] { 1, 2, 3, 4, 4, 3, 2, 1 };
 for (int i = 0, m = 0; m < 4; i = i + m, ++m) {
     for (int j = m, k = 0; k < 4; j = j + diagonals[m+k+1], ++k) {
          Console.Write( i+j+1  );
          Console.Write( " " );
     }
    Console.WriteLine();
 }

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

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