Отсортировать массив прямоугольной матрицы по строкам - 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);
}

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

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

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

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


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

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

5   голосов , оценка 4 из 5
Похожие ответы