Перестановка строк двумерного массива - C (СИ)
Формулировка задачи:
Переставить строки двумерного массива по убыванию значений максимальных елементов строк.
Решение задачи: «Перестановка строк двумерного массива»
textual
Листинг программы
#include <stdio.h>
#include <malloc.h>
#define N 5
int array_max(int* fa, int* la);
void swap_int(int* a, int* b);
//сортировка выбором
int matrix_smax(int mat[][N]){
int i, j, k;
int* arr = (int*)malloc(N * sizeof(int));
if(arr == NULL)
return 0;
for(i = 0; i < N; ++i)
arr[i] = array_max(mat[i], mat[i] + N);
for(i = 0; i < N; ++i){
k = i;
for(j = i + 1; j < N; ++j){
if(arr[j] > arr[k])
k = j;
}
if(i != k){
swap_int(&arr[i], &arr[k]);
for(j = 0; j < N; ++j)
swap_int(&mat[k][j], &mat[i][j]);
}
}
free(arr);
return 1;
}
int main(void){
int i, j;
int mat[N][N] = {
{ 0, 4, 2, 3, 7 },
{ 0, 1, 2, 3, 4 },
{ 4, 5, 8, 5, 0 },
{ 3, 3, 3, 3, 9 },
{ 1, 1, 6, 3, 0 }
};
matrix_smax(mat);
for(i = 0; i < N; ++i){
for(j = 0; j < N; ++j)
printf("%d ", mat[i][j]);
putchar('\n');
}
return 0;
}
//максимум
int array_max(int* fa, int* la){
int m = (fa < la) ? *fa++ : 0;
for(; fa != la; ++fa){
if(*fa > m)
m = *fa;
}
return m;
}
//обмен
void swap_int(int* a, int* b){
int t = *a;
*a = *b;
*b = t;
}
Объяснение кода листинга программы
Код представляет собой функцию matrix_smax, которая сортирует двумерный массив (матрицу) методом сортировки выбором. Список действий:
- Создается функция array_max, которая находит максимум в отрезке массива.
- Создается функция swap_int, которая меняет значения двух переменных.
- В функции matrix_smax создается массив arr, в который будут копироваться максимальные значения из каждого столбца матрицы.
- Происходит итерация по каждому столбцу матрицы, и в arr записывается максимальное значение из этого столбца.
- Происходит итерация по всем элементам матрицы, начиная с левого верхнего угла, и в каждой итерации ищутся два элемента, которые нужно поменять местами, чтобы удовлетворить условию возрастания.
- Если такие элементы найдены, они меняются местами и меняется порядок соответствующих строк в матрице.
- В конце функция освобождает память, выделенную под массив arr.
- В функции main создается матрица mat, заполненная исходными данными.
- Вызывается функция matrix_smax, чтобы отсортировать матрицу.
- Выводится отсортированная матрица.