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

我正在尝试排序2d数组。 首先,我按列排序,然后按行排序。 逐列工作但不是逐行。 这段代码有什么问题?

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

我认为你的意思是以下几点

 #include  #include  #include  #include  #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 
 #include  #include  #include  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; } 

快速排序

排序数组元素

对由base指向的数组的num元素进行排序,每个元素的大小为字节长,使用compar函数来确定顺序。

此函数使用的排序算法通过调用指定的compar函数并将指针作为参数来比较元素对。

该函数不返回任何值,但修改由base指定的数组的内容,重新排序由compar定义的元素。

等效元素的顺序是不确定的。

因此,它将对i列表中的每个15个元素组进行排序,作为一个正常的数组,它将为您提供所看到的结果。 但是,由于“j”是分开的。 您需要做的是为每个i的值为组中的每一行创建一个单一维度的数组表。 然后在每个单一尺寸的行上执行qsort后,将它们适当地移动到原始的2D表中。

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

将按预期排序选项卡的前10个(字符)元素,而不是行。