Сортировка строк в матрице
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 столбец.
Меняйте местами строки синхронно с элементами 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. Код страшный: одна фактическая ошибка и несколько оформительских.