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