矩阵原地转置,空间复杂度为O(1)(暂时先保存下来)
2016-07-20 16:01
751 查看
#include<iostream> using namespace std; /* 后继 */ int getNext(int i, int m, int n) { return (i%n)*m + i/n; } /* 前驱 */ int getPre(int i, int m, int n) { return (i%m)*n + i/m; } /* 处理以下标i为起点的环 */ void movedata(int *mtx, int i, int m, int n) { int temp = mtx[i]; // 暂存 int cur = i; // 当前下标 int pre = getPre(cur, m, n); while(pre != i) { mtx[cur] = mtx[pre]; cur = pre; pre = getPre(cur, m, n); } mtx[cur] = temp; } /* 转置,即循环处理所有环 */ void transpose(int *mtx, int m, int n) { for(int i=0; i<m*n; ++i) { int next = getNext(i, m, n); while(next > i) // 若存在后继小于i说明重复 next = getNext(next, m, n); if(next == i) // 处理当前环 movedata(mtx, i, m, n); } } /* 输出矩阵 */ void print(int *mtx, int m, int n) { for(int i=0; i<m*n; ++i) { if((i+1)%n == 0) cout << mtx[i] << "\n"; else cout << mtx[i] << " "; } } /* 测试 */ int main() { int matrix[4*2] = {1,2,3,4,5,6,7,8}; cout << "Before matrix transposition:" << endl; print(matrix, 4, 2); transpose(matrix, 4, 2); cout << "After matrix transposition:" << endl; print(matrix, 2, 4); return 0; }
相关文章推荐
- Android静态安全检测 -> 日志泄漏风险
- Codeforces Round #363 (Div. 2) A
- 【Intellij】导入 jar 包
- 最小生成树(kruskal)
- rtrim函数的一个坑
- 黑马程序员: PHP零基础土木研究生,如何做到毕业年薪20万?
- javascript多个圆点弧线运动效果
- 深入理解Java的接口与抽象类
- 程序员的八个级别-拿来分享下
- jersey+grizzly学习笔记
- PowerShell提示,因为此系统中禁止执行脚本
- Java 操作Oracle数据库(建表,插数据,删除)
- 软件开发不可与建筑类比
- [LeetCode] 37. Sudoku Solver
- URI和URL的区别(转载)
- [leetcode]229. Majority Element II
- web中spring与jpa整合
- Jquery对复选框CheckBox的操作
- 不要62 hd 2089
- MYSQL数据库操作类