//矩阵转置 按行按列排序
/*
==================================================================
题目:输入m*n矩阵,按行升序排列输出。
输入:
4 3 5 6 2
9 8 1 2 8
7 1 2 3 8
输出:
2 3 4 5 6
1 2 8 8 9
1 2 3 7 8
==================================================================
*/
#include<stdio.h>
#define M 3
#define N 5
main()
{
int i,j,k,a[M][N],b[N][M],c[M][N],d[M][N],t;
//输入原矩阵a
printf("输入%d*%d矩阵:\n",M,N);
for(i=0;i<M;i++)
for(j=0;j<N;j++)
scanf("%d",&a[i][j]);
//输出原矩阵a
printf("\n原序列输出:\n");
for(i=0;i<M;i++)
{
for(j=0;j<N;j++)
printf("%3d ",a[i][j]);
printf("\n");
}
//复制原矩阵a到c
for(i=0;i<M;i++)
for(j=0;j<N;j++)
c[i][j]=a[i][j];
//原矩阵按行排序
printf("按行升序:\n");
i=0;
while(i<M)
{
for(j=0;j<N;j++)
for(k=j+1;k<N;k++)
if(a[i][j]>a[i][k])
{t=a[i][j];a[i][j]=a[i][k];a[i][k]=t;}
i++;
}
//输出原按行排序的结果
for(i=0;i<M;i++)
{
for(j=0;j<N;j++)
printf("%3d ",a[i][j]);
printf("\n");
}
//原矩阵转置得到b
for(i=0;i<M;i++)
for(j=0;j<N;j++)
b[j][i]=c[i][j];
i=0;
//输出转置矩阵b
printf("输出转置矩阵:\n");
for(i=0;i<N;i++)
{
for(j=0;j<M;j++)
printf("%3d ",b[i][j]);
printf("\n");
}
//转置后(即b)按行排序
i=0;
while(i<N)
{
for(j=0;j<M;j++)
for(k=j+1;k<M;k++)
if(b[i][j]>b[i][k])
{t=b[i][j];b[i][j]=b[i][k];b[i][k]=t;}
i++;
}
//再将b转置,即排序后返回原型
printf("按列排序:\n");
for(i=0;i<N;i++)
for(j=0;j<M;j++)
d[j][i]=b[i][j];
//输出b的转置矩阵d,即为原矩阵按列排序
for(i=0;i<M;i++)
{
for(j=0;j<N;j++)
printf("%3d ",d[i][j]);
printf("\n");
}
}
/*
==================================================================
评:改动M(行)和N(列)的值可以实现任意二维矩阵的转置、按行按列排序。
分三段:
1、输入
2、原序输出
3、按行升序
关键是第三步,用while实现j优先于i,待j循环完成后i++,直到i>M;
按列排序可以认为是对转置矩阵按行排序,用两次转置完成!
==================================================================
*/
版权声明:本文为博主原创文章,未经博主允许不得转载。