Сортировка вставки 2D-массива с использованием указателей

#c #sorting #multidimensional-array #insertion-sort #function-definition

#c #сортировка #многомерный массив #вставка-сортировка #функция-определение

Вопрос:

У меня есть задача на моем уроке программирования — отсортировать нечетные строки 2D-массива в порядке возрастания, используя метод сортировки вставки, используя указатель. До сих пор я пробовал без указателя, потому что я не знаю, как это сделать. Вот код, который я создал, и он работает не так, как должен.

 #include<stdio.h>
main(){
    
    int i,j,n,m;
    
    printf("Introduce n=");
    scanf("%d",amp;n);
    
    printf("Introduce m=");
    scanf("%d",amp;m);
    
    int a[n][m];
    
    for(i=0; i<n; i  ){
        for(j=0; j<m; j  ){
            printf("a[%d][%d]=",i,j);
            scanf("%d",amp;a[i][j]);
            }
    }
    
    for(i=1; i<n ; i  )
    {
        for(j=1; j<n; j  )
        {
            if(i%2==1)
            {
                for( j = 1 ; j < m ; j   )
                {
                    int p = j;
                    while(p > 0 amp;amp; a[i][p] < a[i][p-1])
                    {
                        int aux = a[i][p];
                        a[i][p] = a[i][p-1];
                        a[i][p-1] = aux;
                        p --;
                    }
                }
            }
        }
    }
    
    for(i=0; i<n; i  ){
        for(j=0; j<m; j  ){
            printf("a[%d][%d]=%d",i,j,a[i][j]);
        }
    }
    
    return 0;
}
  

Комментарии:

1. Вы могли бы просто увеличить i на 2 вместо проверки, является ли i нечетным на каждой итерации

Ответ №1:

Это непростая задача для новичков, таких как вы и я. Более того, неясно, что означают эти слова «с использованием указателя».

Я могу предложить следующее решение, показанное в демонстрационной программе ниже. То есть есть отдельная функция, которая выполняет сортировку с использованием параметров, имеющих типы указателей на массивы переменной длины.

 #include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>

void sort_by_odd_rows( size_t n, 
                       int ( *first )[n], 
                       int ( *last )[n], 
                       int cmp( const int *, const int *, size_t ) )
{
    if ( first != last amp;amp;   first != last )
    {
        for ( int ( *next )[n] = first;   next != last amp;amp;   next != last; )
        {
            int tmp[n];
            memcpy( tmp, *next, n * sizeof( int ) );
            
            int ( *current )[n] = next;
            while ( current != first amp;amp; cmp( tmp, *( current - 2 ), n ) < 0 )
            {
                memcpy( *current, *( current - 2 ), n * sizeof( int ) );
                current -= 2;
            }
            
            if ( current != next )
            {
                memcpy( *current, tmp, n * sizeof( int ) );
            }
        }
    }
}

int cmp( const int *a, const int *b, size_t n )
{
    size_t i = 0;
    
    while ( i < n amp;amp; a[i] == b[i] )   i;
    
    return i == n ? 0 : ( b[i] < a[i] ) - ( a[i] < b[i] );
}


int main(void) 
{
    size_t m = 10, n = 5;
    int a[m][n];
    
    srand( ( unsigned int )time( NULL ) );
    
    for ( size_t i = 0; i < m; i   )
    {
        for ( size_t j = 0; j < n; j   )
        {
            a[i][j] = rand() % ( m * n );
        }
    }

    for ( size_t i = 0; i < m; i   )
    {
        for ( size_t j = 0; j < n; j   )
        {
            printf( "- ", a[i][j] );
        }
        putchar( 'n' );
    }
    
    putchar( 'n' );

    sort_by_odd_rows( n, a, a   m, cmp );
    
    for ( size_t i = 0; i < m; i   )
    {
        for ( size_t j = 0; j < n; j   )
        {
            printf( "- ", a[i][j] );
        }
        putchar( 'n' );
    }
    
    putchar( 'n' );

    return 0;
}
  

Вывод программы может выглядеть следующим образом

 22  8  2 10  5 
33 21 20 17 45 
 7 20  3  7  5 
47 31 21 29 39 
46 44  0 31  7 
37 43  8 43 23 
 6 15 32  8 25 
39 41 49  9  8 
44 18 30 49 27 
35 46  9  7 28 

22  8  2 10  5 
33 21 20 17 45 
 7 20  3  7  5 
35 46  9  7 28 
46 44  0 31  7 
37 43  8 43 23 
 6 15 32  8 25 
39 41 49  9  8 
44 18 30 49 27 
47 31 21 29 39 
  

Как видно из выходных данных, нечетные строки массива сортируются в порядке возрастания. Первыми элементами нечетных строк после сортировки являются 33, 35,37, 39, 47.

Что касается вашего кода, то он не имеет большого смысла. Например, в этих двух циклах for

     for(j=1; j<n; j  )
    {
        if(i%2==1)
        {
            for( j = 1 ; j < m ; j   )
            //...
  

вы используете ту же переменную j .

РЕДАКТИРОВАТЬ: кажется, я неправильно понял ваше назначение, и вам нужно отсортировать элементы в каждой нечетной строке в порядке возрастания.

В этом случае функция сортировки будет выглядеть намного проще.

Вот демонстрационная программа.

 #include <stdio.h>
#include <stdlib.h>
#include <time.h>

void insertion_sort( int *a, size_t n ) 
{
    for ( int *first = a, *last = a   n; first != last;   first )
    {
        int tmp = *first;
        int *current = first;
        
        for ( ; current != a amp;amp; tmp < *( current - 1 ); --current )
        {
                *current = *( current - 1 );
        }
        
        if ( current != first ) *current = tmp;
    }
}

int main(void) 
{
    size_t m = 10, n = 5;
    int a[m][n];
    
    srand( ( unsigned int )time( NULL ) );
    
    for ( size_t i = 0; i < m; i   )
    {
        for ( size_t j = 0; j < n; j   )
        {
            a[i][j] = rand() % ( m * n );
        }
    }

    for ( size_t i = 0; i < m; i   )
    {
        for ( size_t j = 0; j < n; j   )
        {
            printf( "- ", a[i][j] );
        }
        putchar( 'n' );
    }
    
    putchar( 'n' );

    for ( size_t i = 1; i < m; i  = 2 )
    {
        insertion_sort( *( a   i ), n );
    }
    
    for ( size_t i = 0; i < m; i   )
    {
        for ( size_t j = 0; j < n; j   )
        {
            printf( "- ", a[i][j] );
        }
        putchar( 'n' );
    }
    
    putchar( 'n' );

    return 0;
}
  

Вывод программы может выглядеть следующим образом

 25 32 47 24 10 
33 39 32 31 33 
46  8 49 35 16 
32 34  9 35 22 
13 35 45 27 45 
17 37  2 13  6 
33 40 38 30 14 
48 15  6 32 49 
39 28  7 39 15 
26 23  2 35  8 

25 32 47 24 10 
31 32 33 33 39 
46  8 49 35 16 
 9 22 32 34 35 
13 35 45 27 45 
 2  6 13 17 37 
33 40 38 30 14 
 6 15 32 48 49 
39 28  7 39 15 
 2  8 23 26 35 
  

Теперь в каждой нечетной строке элементы отсортированы в порядке возрастания.

Комментарии:

1. Это то, что вы называете ответом с дополнительным бонусом, объясняющим, как сортировать как по строкам, так и по столбцам для строк, начинающихся с нечетных значений. Жаль, что я не могу проголосовать дважды…

2. Спасибо! Отличный ответ на мою проблему!