我有以下数组:
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++;
}
答案 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
行派生一个封闭的表单公式,然后继续。