Отсортировать массив прямоугольной матрицы по строкам - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток. Помогите с программой.Задание нужно отсортировать массив прямоугольной матрицы по строкам. Сортировка: в начале все отрицательные элементы первым самый большой по модулю, в конце второй по модулю и тд то есть если было -2 -8 -4 -1 отсортирует -8 -2 -1 -4, потом все нули, далее все положительные элементы первым самый маленький по модулю, в конце второй по малости и тд, 2 8 4 1 отсортирует 1 4 8 2. Заранее благодарен.

Решение задачи: «Отсортировать массив прямоугольной матрицы по строкам»

textual
Листинг программы
  1. #include <stdlib.h>
  2. #include <math.h>
  3. #define _CRT_SECURE_DEPRECATE_MEMORY
  4. #include <memory.h>
  5. #include <stdio.h>
  6.  
  7. #define EPS 1.0e-6
  8.  
  9. int dblCmp(const void* d1, const void* d2) {
  10.     if (abs(*(double*)d1 - *(double*)d2) < EPS) return 0;
  11.     else if (*(double*)d1 > *(double*)d2) return 1;
  12.     else return -1;
  13. }
  14.  
  15. void replace(double* mem, size_t num) {
  16.     size_t memSize = num*sizeof(double);
  17.     double* buf = (double*)malloc(memSize);
  18.     memcpy(buf, mem, memSize);
  19.     for (size_t i=0; i < num; ++i) {
  20.         if (i%2 == 0) mem[i/2] = buf[i];
  21.         else mem[num-1-i/2] = buf[i];
  22.     }
  23.     free(buf);
  24. }
  25.  
  26. void lineSort(double* arr, size_t num) {
  27.     qsort(arr, num, sizeof(double), dblCmp);
  28.     size_t neg=0, pos=0;
  29.  
  30.     for (size_t i=0; arr[i] < -EPS && i < num; ++i, ++neg);
  31.     if (neg) replace(arr, neg);
  32.  
  33.     for (size_t i=num-1; arr[i] > EPS && i >= 0; --i, ++pos);
  34.     if (pos) replace(arr+num-pos, pos);
  35. }
  36.  
  37. void printMatrix(const double* matr, size_t n, size_t m) {
  38.     for (size_t i=0; i < n; ++i) {
  39.         for (size_t j=0; j < m; ++j) {
  40.             printf("%.3lf ", *(matr+i*m+j));
  41.         }
  42.         printf("\n");
  43.     }
  44. }
  45.  
  46. int main() {
  47.     double matrix[2][10] = {
  48.         {1.0, -1.0, 0.5, 0.7, 0.0, 0.0, 10.0, -5.0, 3.0, -3.5},
  49.         {-2.0, -8.0, -4.0, -1.0, 2.0, 8.0, 4.0, 1.0, 0.0, 0.0},
  50.     };
  51.     printMatrix(&matrix[0][0], 2, 10);
  52.     for (size_t i=0; i < 2; ++i) {
  53.         lineSort(matrix[i], 10);
  54.     }
  55.     printf("\n");
  56.     printMatrix(&matrix[0][0], 2, 10);
  57. }

Объяснение кода листинга программы

В данном коде реализуется сортировка массива прямоугольной матрицы по строкам. Список действий:

  1. Сортировка матрицы по столбцам:
    • Создается функция dblCmp, которая сравнивает два double значения с точностью до 1.0e-6.
    • В функции replace происходит замена местами элементов массива, начиная с индекса 1, с шагом 2.
    • В функции lineSort матрица сначала сортируется по столбцам с помощью функции qsort, затем, если в строке есть отрицательные значения, они заменяются на соответствующие позиции в начале строки, а если положительные - в конце.
    • В функции printMatrix происходит вывод матрицы на экран.
    • В функции main создается двумерный массив matrix, заполняется значениями, выводится на экран, затем сортируется по строкам и снова выводится.
  2. Сортировка матрицы по строкам:
    • В функции lineSort сортировка происходит следующим образом: сначала отрицательные значения перемещаются в начало строки, затем положительные - в конец. Это позволяет сортировать строки без применения дополнительной памяти.
    • Важно: сортировка происходит только по одной строке за раз, поэтому для сортировки всей матрицы необходимо выполнить сортировку каждой строки отдельно.
  3. Ошибки:
    • В данном коде не обрабатываются ошибки, связанные с делением на ноль или работой с некорректными входными данными.
    • Не проверяется, достаточно ли памяти выделено для матрицы и буфера в функции replace.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы