7-48 实验8_6_矩阵变换(插入排序)

问题描述

任意给定一个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;
}

​

如果内容有问题欢迎共同讨论! 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值