Отсортировать массив прямоугольной матрицы по строкам - 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
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д