Сортировка матрицы, как единого целого - C (СИ)

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

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

Я просмотрел три темы про сортировку матрицы, но там решаются совсем другие задачи. Здесь задана матрица 7*7 И требуется отсортировать ее в порядке возрастания элементов так, как будто матрица есть единый одномерный массив длиной 49 Исходные данные и результаты выводятся на экран. 
#include <stdio.h>
#include <stdlib.h>
#include  <time.h>
 
int i, j, k, l, a[7][7];
int main()
{
    srand(time(NULL));
    for (i = 0; i < 7; i++ ){
        for (j = 0; j < 7; j++ ){
            a[i][j] = rand()% 16 - 8;
            printf("%4d", a[i][j]);}
            printf("\n");}
 
    for (k = 0; k < 49; k++ )
        {
        for (i = 0; i < 6; i++ )
            {
            for (j = 0; j < 6; j++ )
                if(a[i][j] > a[i][j+1]){
                    l = a[i][j]; a[i][j] = a[i][j+1]; a[i][j+1] = l;}
                if(a[i][6] > a[i+1][0]){
                    l = a[i][6]; a[i][6] = a[i+1][0]; a[i+1][0] = l;}
            }
        for (j = 0; j < 6; j++ )
                if(a[6][j] > a[6][j+1]){
                    l = a[6][j]; a[6][j] = a[6][j+1]; a[6][j+1] = l;}
        }
    printf("\n");
    for (i = 0; i < 7; i++ ){
        for (j = 0; j < 7; j++ )
            printf("%4d", a[i][j]);
            printf("\n");}
    return 0;
}

Решение задачи: «Сортировка матрицы, как единого целого»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
 
const char * format_output = "%10d";
 
void * mem_allocate (const uint32_t s)
{
    char * ptr = NULL;
    
    if ((ptr = malloc(s)) == NULL){
        fprintf(stderr, "%s\n", strerror(errno));
        sleep(1);
        return mem_allocate(s);
    }
    return (void*) ptr;
}
 
void ** init_mx (const uint32_t row, const uint32_t col)
{
    int * array = mem_allocate(sizeof(int) * row * col);
    int ** wrap = mem_allocate(sizeof(int*) * row);
    int i = 0;
    
    for (; i < row; i++)
        wrap[i] = array + i * col;
        
    return wrap;
}
 
void free_mx (void ** mx)
{
    int ** m = mx;
    free(m[0]);
    free(m);
    return;
}
 
void set_rand_value (void ** mx, const uint32_t r, const uint32_t c)
{
    int * ptr = mx[0];
    uint32_t s = r * c;
    
    while (s--)
        *ptr++ = rand() % 1000;
    return;
}
 
void dump_mx(void ** mx, const uint32_t r, const uint32_t c)
{
    uint32_t i = 0, j;
    int ** m = (int**)mx;
    
    for(; i < r; i++){
        for(j = 0; j < c; j++)
            printf(format_output, m[i][j]);
        puts("");
    }
    return;
}
 
int compare(void * i, void * j) {
    return *((int*) i) - *((int*) j);
}
 
int
main (int argc, char ** argv)
{    
    int ** mx = init_mx(7, 7);
    srand(time(0));
    set_rand_value(mx, 7, 7);
    dump_mx(mx, 7, 7);
    qsort(mx[0], 7 * 7, sizeof(int), compare);
    dump_mx(mx, 7, 7);
    free_mx(mx);
    exit(EXIT_SUCCESS);
}

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

  1. Включаем необходимые заголовочные файлы для работы с памятью, выводом ошибок, строками и форматом вывода.
  2. Объявляем функцию сортировки массива, которая принимает указатель на начало массива и количество элементов.
  3. Создаем функцию для выделения памяти под матрицу.
  4. Создаем функцию для инициализации матрицы.
  5. Создаем функцию для освобождения памяти, выделенной под матрицу.
  6. Создаем функцию для установки случайного значения в ячейке матрицы.
  7. Создаем функцию для вывода содержимого матрицы на экран.
  8. Создаем функцию для сравнения двух элементов матрицы.
  9. В функции main инициализируем матрицу, заполняем её случайными значениями, выводим на экран, сортируем по возрастанию и снова выводим на экран.
  10. Освобождаем память, выделенную под матрицу, и завершаем программу.

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


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

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

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