问题描述
任意给定一个n*n的矩阵,矩阵的行数与列数均为n。你的任务是通过行变换,使得矩阵每行元素的平均值按递增顺序排列。如果出现有的行平均值相同的情况,则按照原顺序输出。
输入格式:
共n+1行,第一行为一个整数n代表矩阵的行数(列数),n的范围是1—100。后边n行为n*n个整数,即此矩阵的元素。矩阵元素的绝对值不会超过1000000。
输出格式:
共n行,为经过行变换后的新矩阵。每行的每个元素用空格分隔,注意最后一个元素后为换行符。具体见样例。
输入样例:
3
5 5 5
3 3 3
1 1 1
输出样例:
1 1 1
3 3 3
5 5 5
插入排序算法描述:
初始序列:49 38 65 97 76 13 27 49
将元素(38) 插入合适位置: [38 49] 65 97 76 13 27 49
将元素(65) 插入合适位置: [38 49 65] 97 76 13 27 49
将元素(97) 插入合适位置: [38 49 65 97] 76 13 27 49
将元素(76) 插入合适位置: [38 49 65 76 97] 13 27 49
将元素(13) 插入合适位置: [13 38 49 65 76 97] 27 49
将元素(27) 插入合适位置: [13 27 38 49 65 76 97] 49
将元素(49) 插入合适位置: [13 27 38 49 49 65 76 97]
在本题中,则通过嵌套循环来实现矩阵的行交换。
代码如下:
#include <stdio.h>
int main(void)
{
int n, j;
int min;
scanf("%d", &n);
int temp[n+1];
int mtx[n][n+1];
int mtx1[n][n];
/*输入,求和*/
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
scanf("%d", &mtx[i][j]);
for(int i = 0; i < n; i++)
mtx[i][n] = 0; //初始化
for(int i = 0; i < n; i++)
for(j = 0; j < n; j++)
mtx[i][n] += mtx[i][j];//求和
/*插入排序*/
for(int i = 0; i < n-1; i++)
{
if(mtx[i+1][n]<mtx[i][n])
{
for(int t = 0; t < n+1; t++)
temp[t] = mtx[i+1][t];
if(mtx[i+1][n]<mtx[0][n])
{
/*通过嵌套循环实现矩阵的行交换*/
for(int j = i; j >= 0; j--)
for(int t = 0; t < n+1; t++)
mtx[j+1][t] = mtx[j][t];
for(int t = 0; t < n+1; t++)
mtx[0][t] = temp[t];
}
else
for(j = i; j > 0; j--)
{
if(mtx[i+1][n]<mtx[j][n]&&mtx[i+1][n]>=mtx[j-1][n])
{
for(int m = i; m >= j; m--)
for(int t = 0; t < n+1; t++)
mtx[m+1][t] = mtx[m][t];
for(int t = 0; t < n+1; t++)
mtx[j][t] = temp[t];
}
}
}
}
/*打印*/
for(int i = 0; i < n ; i++)
{
for(j = 0; j < n-1 ; j++)
printf("%d ", mtx[i][j]);
printf("%d\n", mtx[i][j]);
}
return 0;
}
如果内容有问题欢迎共同讨论!