需要的公式:将数组排序到数组 - “zig-zag”

时间:2010-03-17 11:41:52

标签: arrays language-agnostic sorting

我有以下数组:

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

我将它用于一些像这样的视觉效果:

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

现在我想像这样对数组进行排序,以便在稍后渲染时产​​生“锯齿形”。

// 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 个答案:

答案 0 :(得分:1)

您可以按原始顺序对其进行排序,您只需以不同的方式单步执行即可。 编辑:原来我的天真实施没有考虑基于对角线的不同步长。下面的代码已在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();
 }

显然,如果你需要保持这种排序,你可以使用这个算法来填充一个新的数组。它还应该扩展 - 您只需要将终止条件更改为数组大小的平方根并自动生成对角线。

答案 1 :(得分:1)

查看矩阵的结构:

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

第一行从1开始

第2行从2 = 1 + 1(第1个zig中的#个元素)开始

第3行从4 = 1开始                           + 1(第1个zig中的#个元素)                           + 2(第二个zig中的#个元素)

...

第3行结束于6 =第3行开始+行数                       = 4 + 3 = 7

您可以为i行派生一个封闭的表单公式,然后继续。