数据结构考点之一维数组实现矩阵转置算法

算法阅读题解题

问题

阅读下列程序

void f30(int A[],int n)

{ 
	int i,j,m;

  for(i=1;i<n;i++)

   for(j=0;j<i;j++)

    {  
			m=A[i*n+j];      // A[i*n+j]与A[j*n+i]值交换

      	A[i*n+j]=A[j*n+i];

      	A[j*n+i]=m;

    }
}

回答下列问题:
(1)已知矩阵
B = ( 1 2 3 4 5 6 7 8 9 ) B=\left(\begin{array}{lll}1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9\end{array}\right) B=147258369
将其按行优先存于一维数组A中,给出执行函数调用f30(A,3)后矩阵B的值;
(2)简述函数f30的功能。

分析

这其实是一道真题,难度大概如此。

第一问

明显就是阅读程序。执行f30(A,3),也就是A数组,n=3代入程序
for(i=1;i<n;i++);//i可以等于1,2

  • i=1时,j只能等于0,所以函数体执行的是:
m=A[1*3+0];//m=A[3];
A[1*3+0]=A[0*3+1];//A[3]=A[1];
A[0*3+1]=m;//A[1]=m;很明显是一维数组对应的数2,4交换

也就是变成了这个样子:
B = ( 1 4 3 2 5 6 7 8 9 ) B=\left(\begin{array}{lll}1 & 4 & 3 \\ 2 & 5 & 6 \\ 7 & 8 & 9\end{array}\right) B=127458369

  • i=2时,j=0,1,所以函数体执行的是:
    • i=2,j=0时
m=A[2*3+0];//m=A[6];
A[2*3+0]=A[0*3+2];//A[6]=A[2];
A[0*3+2]=m;//A[2]=m;很明显是一维数组对应的数3,7交换

也就是变成了这个样子:
B = ( 1 4 7 2 5 6 3 8 9 ) B=\left(\begin{array}{lll}1 & 4 & 7 \\ 2 & 5 & 6 \\ 3 & 8 & 9\end{array}\right) B=123458769

  • i=2,j=1时
m=A[2*3+1];//m=A[7];
A[2*3+1]=A[1*3+2];//A[7]=A[5];
A[1*3+2]=m;//A[5]=m;很明显是一维数组对应的数6,8交换

也就是变成了这个样子:
B = ( 1 4 7 2 5 8 3 6 9 ) B=\left(\begin{array}{lll}1 & 4 & 7 \\ 2 & 5 & 8 \\ 3 & 6 & 9\end{array}\right) B=123456789
最后一步就是矩阵的最终值,可见这种题就是将题目给出数据代入走一遍就行,难度不大

第二问

问f30()函数的功能。由矩阵最终变形可知,就是将原来的行转成列,专业名词就叫矩阵转置。所以函数的功能就是完成矩阵的转置。

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

guangod

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值