Сортировка строк в матрице

using namespace std;

int main()
{
    int rows = 5;
    int cols = 5;
    int a, p1 = 0, p2 = 0, r = -1, c = cols, s, temp;
    int* pr;
    int* pc;
    int **arr = new int* [rows];
    int* arr_diag = new int[rows];
    for (int i = 0; i < rows; i++) { // выеделение памяти под массив
        arr[i] = new int[cols];
    }
    
    for (int i = 0; i < rows; i++) { // заполнение массива
        for (int j = 0; j < cols; j++) {
            cin >> a;
            arr[i][j] = a;
        }
    }

    for (int i = 0; i < rows; i++) { // заполнение массива
        for (int j = 0; j < cols; j++) {
            cout << arr[i][j] << "\t";
        }
        cout << endl;
    }
    
    for (int i = 0; i < rows; i++) { // заполнение массива с полусуммами диаг эл-ов
        r += 1;
        pr = arr[r] + r;
        c -= 1;
        pc = arr[r] + c;
        s = ((*pr) + (*pc)) / 2;
        arr_diag[i] = s;
        s = 0;
    }

    for (int i = 0; i < rows - 1; i++) { // сортировка этого массива
        for (int j = 0; j < rows - i - 1; j++) {
            if (arr_diag[j] > arr_diag[j+1]) {
                temp = arr_diag[j];
                arr_diag[j] = arr_diag[j + 1];
                arr_diag[j + 1] = temp;
            }
        }
    }
    
    

    for (int i = 0; i < rows; i++) {
        delete[] arr[i];
    }
    delete[] arr;
}

вот такой код, нужно упорядочить строки матрицы по возрастанию, по элементам из массива arr_diag. То есть 1 строка матрицы - строка, которой соответствует минимальный элемент из arr_diag и т.д. Желательно сделать с помощью адресной арифметики, если это вообще возможно(всмысле переставить строки в матрице с помощью адресной арифметики).


Ответы (2 шт):

Автор решения: Алексей
for (int i = 0; i < rows - 1; i++) {
    for (int j = 0; j < rows - i- 1; j++) {
        if (arr_diag[j] > arr_diag[j + 1]) {
            temp = arr_diag[j];
            arr_diag[j] = arr_diag[j + 1];
            arr_diag[j + 1] = temp;
            for (int k = 0; k < cols; k++) {
                temp2 = *(*(arr + j) + k);
                *(*(arr + j) + k) = *(*(arr + j + 1) + k);
                *(*(arr + j + 1) + k) = temp2;
            }
        }
    }
}

с помощью такого цикла можно переставлять строки в матрице в соответствии с элементами массива arr_diag. на примере temp2: *(arr + j) - указатель на номер строки, а внешние скобки, *(*(arr + j) + k) указатель на номер столбца, то есть +k столбец.

→ Ссылка
Автор решения: Stanislav Volodarskiy

Меняйте местами строки синхронно с элементами arr_diag:

            if (arr_diag[j] > arr_diag[j+1]) {
                temp = arr_diag[j];
                arr_diag[j] = arr_diag[j + 1];
                arr_diag[j + 1] = temp;

                // arr[j] <-> arr[j + 1]
                int *row = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = row;
            }

P.S. Код страшный: одна фактическая ошибка и несколько оформительских.

→ Ссылка