- 注册时间
- 2007-12-26
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 92615
- 在线时间
- 小时
|
楼主 |
发表于 2009-5-2 09:08:16
|
显示全部楼层
更优化的版本
- /* 对应帖号:http://bbs.emath.ac.cn/viewthread.php?tid=1437&page=2&fromuid=8#pid18832 */
- /* 算法功能:矩阵原地逆时针旋转90度(矩阵原地转置、顺时针旋转90度等均可参考) */
- /* 算法优化:郭先强 */
- /* 修订日期:2009-05-02 */
-
- #include <stdio.h>
- #include <stdlib.h>
-
- void output( int *a, int w, int h )
- {
- int i, j;
- for ( i=0; i<h; ++i )
- {
- for( j=0; j<w; ++j )
- {
- printf( "%d ", a[i*w+j] );
- }
- printf( "\n" );
- }
- printf( "\n" );
- }
-
- void transf( int *a, int w, int h )
- {
- int k, pos, t, c=w*h;
- div_t xy;
-
- #define TRANSF(pos,w,h) xy = div( pos, w ); pos = (w-1-xy.rem)*h + xy.quot;
-
- for( k=0; ; ++k )
- {
- pos = k;
- do
- {
- TRANSF( pos, w, h );
- } while( pos > k );
-
- if( pos == k )
- {
- t = a[k];
- do
- {
- TRANSF( pos, w, h );
-
- a[pos] ^= t ^= a[pos] ^= t;
- --c;
- } while( pos != k );
-
- if ( c <= 1 )
- break;
- }
- }
-
- #undef TRANSF
- }
-
- int main()
- {
- int w=12, h=16, i, j;
- int *a = malloc( w*h*sizeof(int) );
-
- for( i=0; i<h; ++i )
- {
- for( j=0; j<w; ++j )
- {
- a[i*w+j]=i*w+j+1;
- }
- }
-
- output( a, w, h );
- transf( a, w, h );//旋转
- output( a, h, w );
-
- free( a );
-
- return 0;
- }
复制代码 此算法相对于 6#,最大的改进是可以提前结束循环。
如果用一个数组标记矩阵各元素是否被置换,则可以更快地判断某些位置上的元素是否已置换,但需多耗元素总数1/8字节的空间;
当然,如果空间充裕,可以另开一个等大的空间,则不存在读写有overlap的问题,算法设计更容易,效率也更高。 |
|