首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言問答

C語言 3×3 矩陣轉置:就地算法與工程實現

     編輯:C 語言問答

方陣轉置的就地算法核心:僅交換上三角元素

算法原理

對於 N×N 方陣,轉置相當於關於主對角線鏡像。只需遍歷上三角(或下三角)區域,交換 a[i][j] 與 a[j][i],避免重複交換和對角線自交換。

完整可運行代碼

#include <stdio.h>

void transpose_3x3(int matrix[3][3]) {
    for (int i = 0; i < 3; i++) {
        for (int j = i + 1; j < 3; j++) {  // 關鍵:j 從 i+1 開始,只處理上三角
            int temp = matrix[i][j];
            matrix[i][j] = matrix[j][i];
            matrix[j][i] = temp;
        }
    }
}

void print_matrix(const char *title, int matrix[3][3]) {
    printf("%s:\n", title);
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            printf("%4d", matrix[i][j]);
        }
        printf("\n");
    }
}

int main() {
    int matrix[3][3] = {
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9}
    };
    
    print_matrix("原始矩陣", matrix);
    transpose_3x3(matrix);
    print_matrix("轉置後", matrix);
    
    // 驗證:再次轉置應還原
    transpose_3x3(matrix);
    print_matrix("再次轉置(還原)", matrix);
    
    return 0;
}

執行結果

原始矩陣:
   1   2   3
   4   5   6
   7   8   9

轉置後:
   1   4   7
   2   5   8
   3   6   9

再次轉置(還原):
   1   2   3
   4   5   6
   7   8   9

交換過程圖解

原始索引:          轉置交換對 (i,j) ↔ (j,i):
(0,0) (0,1) (0,2)    (0,1)↔(1,0)  (0,2)↔(2,0)  (1,2)↔(2,1)
(1,0) (1,1) (1,2)    對角線 (0,0)(1,1)(2,2) 不動
(2,0) (2,1) (2,2)

僅需 3 次交換:N×(N-1)/2 = 3×2/2 = 3

通用 N×N 版本

void transpose_square(int n, int matrix[n][n]) {  // C99 VLA
    for (int i = 0; i < n; i++) {
        for (int j = i + 1; j < n; j++) {
            int temp = matrix[i][j];
            matrix[i][j] = matrix[j][i];
            matrix[j][i] = temp;
        }
    }
}

// 非方陣 M×N 轉置為 N×M(需額外空間)
void transpose_rectangular(int m, int n, int src[m][n], int dst[n][m]) {
    for (int i = 0; i < m; i++)
        for (int j = 0; j < n; j++)
            dst[j][i] = src[i][j];
}

時間空間複雜度

常見錯誤

// 錯誤1:雙重循環全遍歷 → 交換兩次 = 原樣
for (i=0; i<3; i++)
    for (j=0; j<3; j++)
        swap(a[i][j], a[j][i]);  // 錯誤!

// 錯誤2:j 從 0 開始 → 重複交換 + 對角線自交換
for (i=0; i<3; i++)
    for (j=0; j<3; j++)  // 應為 j=i+1
        swap(a[i][j], a[j][i]);

// 正確:僅上三角
for (i=0; i<3; i++)
    for (j=i+1; j<3; j++)
        swap(a[i][j], a[j][i]);
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
算法時間複雜度空間複雜度適用場景
就地方陣轉置O(N²)O(1)方陣、內存受限
額外空間轉置O(M×N)O(M×N)非方陣、需保留原矩陣
緩存優化分塊O(N²)O(1)大矩陣、高性能計算