Как отсортировать 2D матрицу по последнему столбцу - PullRequest
0 голосов
/ 30 ноября 2018

Как можно отсортировать 2D-матрицу по последнему столбцу, используя сопоставимую функцию вместо использования массивов позиций?

4 20 15 23 18 9 89 1 8 23 22 14 18 86 17 15 13 18 12 15 90 3 18 8 20 12 5 66

Это мой пример 2D-матрицы, где последний столбец представляетсумма элементов строки i = 1 -> n .Я должен отсортировать строки в порядке возрастания, сравнивая элементы последнего столбца.

РЕДАКТИРОВАТЬ!

Первый код был таким:

int main()
{
    int x[101][101],y[101],z[101],n,m;
    int i,I,j,l,Mi=1000001,b=0;
    int s=0;

    cin>>n>>m;

    for(i=1;i<=n;i++)
        for(I=1;I<=m;I++)
            cin>>x[i][I];
    for(i=1;i<=n;i++)
    {
        s=0;
        for(I=1;I<=m;I++)
            s=s+x[i][I];
        y[i]=s;
    }
    for(l=1;l<=n;l++)
    {
        Mi=1000001;
        for(j=1;j<=n;j++)
            if(y[j]<Mi)
            {
                Mi=y[j];
                b=j;
            }
        z[l]=b;
        y[b]=1000002;
    }

    for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)
            cout<<x[z[i]][j]<<" ";
        cout<<endl;
    }
    return 0;
}

Но, как я уже сказал ... я использовал массивы возможностей, которые не лучшую в использовании, потому что они занимают много места, а я нетЯ не хочу этого.Массив является целочисленным массивом.Я застрял, потому что я не знаю другого метода, поэтому я хотел обратиться за вашей помощью.

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Прежде всего - используйте std::array<T, size> вместо массивов квадратных скобок в стиле C (T[]).Использование:

std::array<std::array<int, 7>, 4> matrix{
        {
                {{4, 20, 15, 23, 18, 9, 89}},
                {{1, 8, 23, 22, 14, 18, 86}},
                {{17, 15, 13, 18, 12, 15, 90}},
                {{3, 18, 8, 20, 12, 5, 66}}
        }
};

Хотя запутанное число скобок может показаться странным на первый взгляд, вы быстро забудете об этом, когда поймете, насколько мощным является инструмент std::array.

Секундавсе - использовать стандартные алгоритмы.Вам необходимо:

  • получить последний элемент данной строки
  • получить последний элемент другой строки
  • определить функцию сравнения, которая будет сравнивать вышеупомянутые элементы сэффективно использовать для сравнения целых строк
  • использовать эту функцию со стандартным алгоритмом сортировки: std::sort

Предлагаемое решение:

std::sort(matrix.begin(), matrix.end(), [](const auto& first_row,
                                           const auto& second_row) {
    return first_row.back() < second_row.back();
});

Мы используем лямбда-выражение для определения компаратора, который будет сравнивать две строки.Это все, что нужно std::sort - способ сравнения двух элементов диапазона, который он сортирует - в этом случае мы определяем, как сравнивать две строки матрицы (обычным способом C++ является предоставлениестрогое слабое упорядочение с использованием оператора меньше чем - поэтому для сравнения последних элементов или каждой строки используется <. Если вы хотите изменить порядок, просто используйте >. Не используйте ни <=, ни >=, поскольку они не обеспечивают строгий порядок).

0 голосов
/ 30 ноября 2018

Посмотрите на этот простой пример.Я предлагаю использовать std :: vector для хранения матрицы.Для сортировки используйте std :: sort с определенной лямбда сравнения ( cmp ).

#include <iostream>
using namespace std;

const int C = 5, R = 5;
using row = vector<int>;
using matr = vector<row>;

struct matrix
{
    matr m_matrix;
    matrix(int row, int col)
    {
        m_matrix.resize(row);
        for(auto &a : m_matrix)
            a.resize(col);
    }
    void set(int r, int c, int val)
    {
        m_matrix[r][c] = val;
    }
    void sort()
    {
        auto cmp = [](const row &r1, const row &r2)
        {
            return r1[r1.size() - 1] < r2[r2.size() - 1];
        };
        std::sort(m_matrix.begin(), m_matrix.end(), cmp);
    }
    void print()
    {
        for(auto &a : m_matrix)
        {
            for(auto v : a)
                cout << v << "  ";
            cout << endl;
        }
    }
};


void fill_matrix(matrix &m)
{
    int cntr = 15;
    for(int i = 0;i < C;i++)
    {
        int sum = 0;
        for(int j = 0;j < R - 1;j++)
        {
            int value = 10 + (cntr++) % 20;
            m.set(i, j, value);
            sum += value;
        }
        m.set(i, R - 1, sum);
    }
}


int main(int argc, char* argv[])
{
    matrix m(5, 5);
    fill_matrix(m);    
    m.print();
    cout << endl;
    m.sort();
    m.print();
}

Результаты:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...