矩阵的排序

在一个m*n矩阵中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,按从小到大的顺序打印这个矩阵到一个一维数组中。如图,则应打印出

1,2,2,4,4,6,7,8,8,9,9,10,11,12,13,15.

这里写图片描述

思路:

如果把它想成 合并m个大小为n的数组,那么思路将会很简单。
但是,矩阵的m和n为随机值,所以并不能想很简单的那种合并。
假如我们定义一个大小为m的数组s,他的下表对应矩阵不同的行,
对应的值我们保存当前矩阵遍历到的位置,由于不同行是经过排序的,
所以我们只需要找出m行里最小的元素,放到指定数组,即可实现排序。
例如:
第一次 从1 2 4 6里找到最小的1,此时第一行的第一个元素已经遍历,所以我们定义的数组s,对应的s[0]+=1,表示下一个遍历的位置在1.

代码

int * Sort(int ar[][4],int m,int n)
{
    int *ret = (int *)malloc(sizeof(int)*m*n); //保存结果的数组
    int *s = (int *)malloc(sizeof(int)*n);//保存当前遍历位置
    memset(s, 0, sizeof(int)*n);//初始化为0

    for (int i=0; i < m*n; i++)
    {
        int min=0;//保存最小值在第几行
        while (s[min] == n)min++;//如果当前行全部遍历完了则不需要判断了

        for (int l = min+1; l < m; l++)
        {
            if (ar[min][s[min]] > ar[l][s[l]])
            {
                min = l;//更新min位置
            }
        }
        ret[i] = ar[min][s[min]];//保存结果
        s[min]++;       // 遍历位置更新
    }
    free(s);//内存释放
    return ret;
}

运行结果

这里写图片描述
这里写图片描述

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值