Отсортировать массив прямоугольной матрицы по строкам - C (СИ)
Формулировка задачи:
Доброго времени суток. Помогите с программой.Задание нужно отсортировать массив прямоугольной матрицы по строкам. Сортировка: в начале все отрицательные элементы первым самый большой по модулю, в конце второй по модулю и тд то есть если было -2 -8 -4 -1 отсортирует -8 -2 -1 -4, потом все нули, далее все положительные элементы первым самый маленький по модулю, в конце второй по малости и тд, 2 8 4 1 отсортирует 1 4 8 2. Заранее благодарен.
Решение задачи: «Отсортировать массив прямоугольной матрицы по строкам»
textual
Листинг программы
#include <stdlib.h>
#include <math.h>
#define _CRT_SECURE_DEPRECATE_MEMORY
#include <memory.h>
#include <stdio.h>
#define EPS 1.0e-6
int dblCmp(const void* d1, const void* d2) {
if (abs(*(double*)d1 - *(double*)d2) < EPS) return 0;
else if (*(double*)d1 > *(double*)d2) return 1;
else return -1;
}
void replace(double* mem, size_t num) {
size_t memSize = num*sizeof(double);
double* buf = (double*)malloc(memSize);
memcpy(buf, mem, memSize);
for (size_t i=0; i < num; ++i) {
if (i%2 == 0) mem[i/2] = buf[i];
else mem[num-1-i/2] = buf[i];
}
free(buf);
}
void lineSort(double* arr, size_t num) {
qsort(arr, num, sizeof(double), dblCmp);
size_t neg=0, pos=0;
for (size_t i=0; arr[i] < -EPS && i < num; ++i, ++neg);
if (neg) replace(arr, neg);
for (size_t i=num-1; arr[i] > EPS && i >= 0; --i, ++pos);
if (pos) replace(arr+num-pos, pos);
}
void printMatrix(const double* matr, size_t n, size_t m) {
for (size_t i=0; i < n; ++i) {
for (size_t j=0; j < m; ++j) {
printf("%.3lf ", *(matr+i*m+j));
}
printf("\n");
}
}
int main() {
double matrix[2][10] = {
{1.0, -1.0, 0.5, 0.7, 0.0, 0.0, 10.0, -5.0, 3.0, -3.5},
{-2.0, -8.0, -4.0, -1.0, 2.0, 8.0, 4.0, 1.0, 0.0, 0.0},
};
printMatrix(&matrix[0][0], 2, 10);
for (size_t i=0; i < 2; ++i) {
lineSort(matrix[i], 10);
}
printf("\n");
printMatrix(&matrix[0][0], 2, 10);
}
Объяснение кода листинга программы
В данном коде реализуется сортировка массива прямоугольной матрицы по строкам. Список действий:
- Сортировка матрицы по столбцам:
- Создается функция
dblCmp, которая сравнивает два double значения с точностью до 1.0e-6. - В функции
replaceпроисходит замена местами элементов массива, начиная с индекса 1, с шагом 2. - В функции
lineSortматрица сначала сортируется по столбцам с помощью функцииqsort, затем, если в строке есть отрицательные значения, они заменяются на соответствующие позиции в начале строки, а если положительные - в конце. - В функции
printMatrixпроисходит вывод матрицы на экран. - В функции
mainсоздается двумерный массивmatrix, заполняется значениями, выводится на экран, затем сортируется по строкам и снова выводится.
- Создается функция
- Сортировка матрицы по строкам:
- В функции
lineSortсортировка происходит следующим образом: сначала отрицательные значения перемещаются в начало строки, затем положительные - в конец. Это позволяет сортировать строки без применения дополнительной памяти. - Важно: сортировка происходит только по одной строке за раз, поэтому для сортировки всей матрицы необходимо выполнить сортировку каждой строки отдельно.
- В функции
- Ошибки:
- В данном коде не обрабатываются ошибки, связанные с делением на ноль или работой с некорректными входными данными.
- Не проверяется, достаточно ли памяти выделено для матрицы и буфера в функции
replace.