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