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