對於 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
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];
}
| 算法 | 時間複雜度 | 空間複雜度 | 適用場景 |
|---|---|---|---|
| 就地方陣轉置 | O(N²) | O(1) | 方陣、內存受限 |
| 額外空間轉置 | O(M×N) | O(M×N) | 非方陣、需保留原矩陣 |
| 緩存優化分塊 | O(N²) | O(1) | 大矩陣、高性能計算 |