转置1维数组

Leg*_*las 8 c c++ algorithm

所以我有一个带有N个值的一维数组,其中N是一个完美的正方形.我将这个一维数组可视化为二维数组(尽管它不是).例如,具有值的数组int Array = { 0,1,2,3,4,5,6,7,8 }

那是

int *Array = new int [9];                                                                                                                                                                                                    
for ( int i = 0 ; i < 9 ; i ++ )
         Array[i] = i; // For example
Run Code Online (Sandbox Code Playgroud)

打印为

0 1 2
3 4 5 
6 7 8
Run Code Online (Sandbox Code Playgroud)

所以,我想在一维数组中交换位置,以便我得到它的转置,...

例如...

0 3 6
1 4 7
2 5 8
Run Code Online (Sandbox Code Playgroud)

这基本上是相同的一维数组,但交换值使得数组现在是int Array = {0,3,6,1,4,7,2,5,8}

如果我将它缩放到1024*1024维度的数组,逻辑将如何?

wxf*_*les 19

有了n = sqrt(N),您可以尝试一些简单的事情:

for(int i = 0; i < n; ++i)
    for(int j = i+1; j < n; ++j)
        std::swap(Array[n*i + j], Array[n*j + i]);
Run Code Online (Sandbox Code Playgroud)


cJ *_*oub 8

转置操作执行swap(v[y][x],v[x][y])除了矩阵的对角线之外的上三角或下三角(让我们说上面).

在C一维向量中vc,v[y][x]对应于vc[y*n+x].所以你想做vc[y*n+x] = vc[x*n+y]

您想要交换的元素就是那些元素x > y.

你最终做了:

for(int y = 0; y < n; ++y)
    for(int x = y+1; x < n; ++x)
        swap(vc[x*n + y], vc[y*n + x]);
Run Code Online (Sandbox Code Playgroud)

你可以自己想出来......