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