C语言 使用qsort对2D数组进行排序

dojqjjoe  于 2023-03-28  发布在  其他
关注(0)|答案(3)|浏览(167)

我试图排序二维数组。首先我排序它的列,然后行。列的列是工作,但行的行不。什么是错误的,在这段代码?

int scmpr (const void *a, const void *b){ 
return strcmp((const char*)a, (const char*)b);
}

int main(void){
  int i,j;

  char **tab;
  tab=(char**)malloc(sizeof(char*)* 10); 

  for(i=0; i<10; i++){
    tab[i]=(char*)malloc(sizeof(char)*15);
  }

  for(i=0; i<10; i++){
    for(j=0; j<15; j++){
      tab[i][j]=rand()%20+'b';
      printf("%c ", tab[i][j]);
    }
    puts("");
  }
  for (i = 0; i<10; i++){
    qsort(&tab[i][0], 15, sizeof(char), scmpr); 
  }
  qsort(tab, 10, sizeof(char), scmpr); //<-- doesn't work

    for(i=0; i<10; i++){
      for(j=0; j<15; j++){
        printf("%c ", tab[i][j]);
      }
    puts("");
    } 
  puts("");
  return 0;
  }
l7mqbcuq

l7mqbcuq1#

我想你的意思是

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

#define M   10
#define N   15

int ccmp( const void *lhs, const void *rhs )
{
    unsigned char c1 = *( const unsigned char *)lhs;
    unsigned char c2 = *( const unsigned char *)rhs; 

    if ( c1 < c2 ) return -1;
    else if ( c2 < c1 ) return 1;
    else return 0;
}

int scmp( const void *lhs, const void *rhs )
{
    return strcmp( *( const char ** )lhs, *( const char ** )rhs );
}

int main( void ) 
{
    char **tab;
    tab = ( char** )malloc( M * sizeof( char* ) ); 

    for ( size_t i = 0; i < M; i++ )
    {
        tab[i] = ( char* )malloc( N * sizeof( char ) );
    }

    srand( ( unsigned int )time( NULL ) );

    for ( size_t i = 0; i < M; i++ )
    {
        for ( size_t j = 0; j < N - 1; j++ )
        {
            tab[i][j] = rand() % ( 'Z' - 'A' + 1 ) + 'A';
        }
        tab[i][N-1] = '\0';
    }

    for ( size_t i = 0; i < M; i++ )
    {
        printf( "%s\n", tab[i] );
    }

    printf( "\n" );

    for ( size_t i = 0; i < M; i++ )
    {
        qsort( tab[i], N - 1, sizeof( char ), ccmp ); 
    }
    qsort( tab, M, sizeof( char * ), scmp );

    for ( size_t i = 0; i < M; i++ )
    {
        printf( "%s\n", tab[i] );
    }

    printf( "\n" );

    for ( size_t i = 0; i < M; i++ ) free( tab[i] );
    free( tab );

    return 0;
}

程序输出可能如下所示

DJSKLJOHGHEANW
ZSDZJZXCKGYOVF
LHEOQYAEHOLPYR
PLORDTQOSNQFVP
TQUEYAVQYVUHKH
WIZOVPHYKXPEMF
JHUFARLARGQSEN
BOWYYXOTMVTYUI
DIOOPKVPDHPXPI
PTXQJVQHTGCHDY

AAEFGHJLNQRRSU
ADEGHHJJKLNOSW
AEEHHLLOOPQRYY
AEHHKQQTUUVVYY
BIMOOTTUVWXYYY
CDFGJKOSVXYZZZ
CDGHHJPQQTTVXY
DDHIIKOOPPPPVX
DFLNOOPPQQRSTV
EFHIKMOPPVWXYZ
kupeojn6

kupeojn62#

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

int scmpr (const void *a, const void *b){//receive char **
    return strcmp(*(const char**)a, *(const char**)b);
}
int ccmpr (const void *a, const void *b){//compare one char
    unsigned char x = *(unsigned char *)a;
    unsigned char y = *(unsigned char *)b;
    return (x > y) - (x < y);
}

int main(void){
    int i,j;

    char **tab;
    tab=(char**)malloc(sizeof(char*)* 10); 

    for(i=0; i<10; i++){
        tab[i]=(char*)malloc(sizeof(char)*16);//+1 for NUL char to use strcmp
    }

    for(i=0; i<10; i++){
        for(j=0; j<15; j++){
            tab[i][j]=rand()%20+'b';
            printf("%c ", tab[i][j]);
        }
        tab[i][j] = 0;//set NUL
        puts("");
    }
    for (i = 0; i<10; i++){
        qsort(&tab[i][0], 15, sizeof(char), ccmpr); 
    }
    qsort(tab, 10, sizeof(char*), scmpr);//element is char*

    puts("");

    for(i=0; i<10; i++){
        for(j=0; j<15; j++){
            printf("%c ", tab[i][j]);
        }
        puts("");
    }
    //deallocate
    return 0;
}
dnph8jn4

dnph8jn43#

qsort

对数组元素排序

使用compar函数确定顺序,对由base指向的数组的num个元素进行排序,每个元素的大小为字节长。
此函数使用的排序算法通过调用指定的compar函数(将指向元素对的指针作为参数)来比较元素对。
该函数不返回任何值,但修改base所指向的数组的内容,并按照比较的定义对其元素进行重新排序。
等价元素的顺序未定义。
因此,它将对i列表中的每组15个元素进行排序,作为一个普通数组,这将给予你看到的结果。然而,由于“j”是分开的。你需要做的是为i的每个值创建一个一维数组表。然后在每个一维行上执行qsort后,将它们适当地移动到原始的2D表中。

qsort(tab, 10, sizeof(char*), scmpr);//element is char*

将对tab的前10个(字符)元素进行qsort,而不是按预期对行进行qsort。

相关问题