就地矩阵旋转

J. *_*lin 6 c matrix

我发现一个有趣的问题,要求将NxN矩阵旋转90度.我在C中的递归解决方案如下.但是当我查找其他解决方案时,大多数都使用嵌套for循环来完成任务(这似乎工作正常).嵌套循环实现似乎及时运行O(n^2).

请参阅: 如何旋转二维数组?

我相信递归解决方案也会运行O( (n^2-n)/2 ),也是O(n^2)如此.我的问题是双重的.1)我的复杂性分析是否适用于递归和非递归解决方案,以及2)是否有一些高效或巧妙的方法来旋转我没有找到的矩阵?

TIA.

#include <stdio.h>
#include <stdlib.h>


int SIZE = 0;


/**
 * In-place, recursive, clockwise, 90 degree matrix rotation.
 */
static void rotate_in_place( int matrix[][SIZE], int n )
{
    if( n < 2 )
        return;


    int temp1, temp2;

    for( int i = 0; i < (n-1); i++ )
    {
        temp1 = matrix[i][n-1];
        matrix[i][n-1] = matrix[0][i];

        temp2 = matrix[n-1][n-i-1];
        matrix[n-1][n-i-1] = temp1;

        temp1 = matrix[n-i-1][0];
        matrix[n-i-1][0] = temp2;

        matrix[0][i] = temp1;
    }


    matrix = ((int*)matrix) + SIZE + 1;
    n -= 2;
    rotate_in_place( matrix, n );
}


static void print_matrix( int matrix[][SIZE] )
{
    printf( "\n" );
    for( int i = 0; i < SIZE; i++ )
    {
        for( int j = 0; j < SIZE; j++ )
            printf( "%4i ", matrix[i][j] );

        printf( "\n" );
    }
}


int main()
{

    // Create some matrices and rotate them.
    //
        int matrices = 10;

        for( int i = 2; i < matrices; i++ )
        {
            int matrix[i][i];

            int count = 0;
            for( int j = 0; j < i; j++ )
                for( int k = 0; k < i; k++ )
                    matrix[j][k] = ++count;


            printf( "\n\nRotating %ix%i matrix.\n", i, i );

            SIZE = i;

            printf( "\nOriginal matrix.\n" );
            print_matrix( matrix );

            rotate_in_place( matrix, i );

            printf( "\n\nRotated matrix.\n" );
            print_matrix( matrix );
        }


    return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

Joe*_*cou 2

旋转不能在少于 n^2 次操作中完成,因为您需要交换所有元素。然而,通常情况下,由于旋转会非常严重地破坏缓存,因此我们会避免执行它;)