在一个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;
}
运行结果
时间: 2024-10-05 09:20:41