Сортировка матрицы, как единого целого - 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;
}

Код к задаче: «Сортировка матрицы, как единого целого - C (СИ)»

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);
}

10   голосов, оценка 4.000 из 5


СОХРАНИТЬ ССЫЛКУ