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