📜  门| GATE CS 2018 |第 50 题(1)

📅  最后修改于: 2023-12-03 15:12:36.471000             🧑  作者: Mango

题目描述

给定一个 n * m 的矩阵,编写一个函数来排序所有元素。每一行必须是升序的,每一列也必须是升序的。可以假定所有元素都是比较相似的,所以可以使用快速排序的较佳策略。

函数签名:void sortMatrix(int* matrix[], int n, int m)

输入格式
  • 第一行包括整数n和m,表示矩阵的行数和列数,分别满足1 ≤ n,m ≤ 10^3。
  • 接下来n行,每行包括m个整数,表示矩阵中元素的值,满足-10^3 ≤ matrix[i][j] ≤ 10^3.
输出格式
  • 一个n * m的矩阵,其中元素已排好序。
示例
Input:
3 3
5 4 3
0 2 1
7 6 8
Output:
3 4 5
1 2 0
6 7 8

思路分析

对于一个矩阵,我们可以将其看成一个数组,然后将数组进行排序。如何排序呢?我们可以选择快排,先根据每行的第一个数进行分割,然后分别递归排序,最后再将整个数组进行排序。这里我们选用STL自带的sort函数。

代码实现

#include <bits/stdc++.h>

using namespace std;

int n, m;
int matrix[1005][1005];

void sortMatrix(int* matrix[], int n, int m) {
    for (int i = 0; i < n; i++) {
        sort(matrix[i], matrix[i] + m);
    }
    for (int i = 0; i < m; i++) {
        int col[1005];
        for (int j = 0; j < n; j++) {
            col[j] = matrix[j][i];
        }
        sort(col, col + n);
        for (int j = 0; j < n; j++) {
            matrix[j][i] = col[j];
        }
    }
}

int main() {
    cin >> n >> m;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cin >> matrix[i][j];
        }   
    }
    sortMatrix(matrix, n, m);
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cout << matrix[i][j] << " ";
        }
        cout << endl;
    }   
    return 0;
}