Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用指针对二维数组进行插入排序_C_Sorting_Multidimensional Array_Insertion Sort_Function Definition - Fatal编程技术网

C 使用指针对二维数组进行插入排序

C 使用指针对二维数组进行插入排序,c,sorting,multidimensional-array,insertion-sort,function-definition,C,Sorting,Multidimensional Array,Insertion Sort,Function Definition,我在编程课上有一个任务——使用插入排序方法,使用指针,按升序对2D数组的奇数行进行排序。到目前为止,我试着不用指针,因为我不知道怎么做。下面是我编写的代码,但它没有正常工作 #include<stdio.h> main(){ int i,j,n,m; printf("Introduce n="); scanf("%d",&n); printf("Introduce

我在编程课上有一个任务——使用插入排序方法,使用指针,按升序对2D数组的奇数行进行排序。到目前为止,我试着不用指针,因为我不知道怎么做。下面是我编写的代码,但它没有正常工作

#include<stdio.h>
main(){
    
    int i,j,n,m;
    
    printf("Introduce n=");
    scanf("%d",&n);
    
    printf("Introduce m=");
    scanf("%d",&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",&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 && 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;
}
#包括
main(){
int i,j,n,m;
printf(“引入n=”);
scanf(“%d”和“&n”);
printf(“引入m=”);
scanf(“%d”、&m);
int a[n][m];

对于(i=0;i来说,对于像你和我这样的初学者来说,这不是一件容易的事情。此外,“使用指针”这个词的意思还不清楚

我可以建议如下演示程序中所示的解决方案。 也就是说,有一个单独的函数,它使用具有指向可变长度数组的指针类型的参数执行排序

#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 && ++first != last )
    {
        for ( int ( *next )[n] = first; ++next != last && ++next != last; )
        {
            int tmp[n];
            memcpy( tmp, *next, n * sizeof( int ) );
            
            int ( *current )[n] = next;
            while ( current != first && 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 && 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( "%2d ", 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( "%2d ", a[i][j] );
        }
        putchar( '\n' );
    }
    
    putchar( '\n' );

    return 0;
}
从输出可以看出,数组的奇数行是按升序排序的。排序后的奇数行的第一个元素是33、35、37、39、47

对于你的代码来说,这并没有什么意义

    for(j=1; j<n; j++)
    {
        if(i%2==1)
        {
            for( j = 1 ; j < m ; j ++)
            //...
程序输出可能如下所示

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 
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 

现在,每个奇数行都有按升序排序的元素。

您可以将i增加2,而不是每次迭代都检查i是否为奇数。这就是您所说的答案,另外还解释了如何对以奇数值开头的行进行按行和按列排序。太糟糕了,我不能再投票了……谢谢!这是一个很好的答案我的问题!@WinterCurse,请看一下:
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