这个数组声明
const char *str_arr[]
表示您有一个指向(的第一个字符)字符串的指针数组。那就是数组的元素是指针。并且要对数组进行排序,您需要交换指向字符串的指针元素。
这是一个演示程序,它展示了如何根据数组元素所指向的字符串的字典比较对这样的数组进行排序。
#include <stdio.h>
#include <string.h>
int cmp( const void *a, const void *b )
{
const char *s1 = a;
const char *s2 = b;
return strcmp( s1, s2 );
}
void bubble_sort( const char * s[], size_t n, int cmp( const void *, const void * ) )
{
for ( size_t last = n; !( n < 2 ); n = last )
{
for ( size_t i = last = 1; i < n; ++i )
{
if ( cmp( s[i], s[i - 1] ) < 0 )
{
const char *tmp = s[i];
s[i] = s[i - 1];
s[i - 1] = tmp;
last = i;
}
}
}
}
int main(void)
{
const char * s[] =
{
"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"
};
const size_t N = sizeof( s ) / sizeof( *s );
for ( size_t i = 0; i < N; i++ )
{
printf( "\"%s\" ", s[i] );
}
putchar( '\n' );
bubble_sort( s, N, cmp );
for ( size_t i = 0; i < N; i++ )
{
printf( "\"%s\" ", s[i] );
}
putchar( '\n' );
return 0;
}
程序输出是
"zero" "one" "two" "three" "four" "five" "six" "seven" "eight" "nine"
"eight" "five" "four" "nine" "one" "seven" "six" "three" "two" "zero"
使用比较功能,您可以指定任何排序标准。例如,要按字符串长度对数组进行排序,您可以编写
#include <stdio.h>
#include <string.h>
int cmp( const void *a, const void *b )
{
size_t n1 = strlen( a );
size_t n2 = strlen( b );
return ( n2 < n1 ) - ( n1 < n2 );
}
void bubble_sort( const char * s[], size_t n, int cmp( const void *, const void * ) )
{
for ( size_t last = n; !( n < 2 ); n = last )
{
for ( size_t i = last = 1; i < n; ++i )
{
if ( cmp( s[i], s[i - 1] ) < 0 )
{
const char *tmp = s[i];
s[i] = s[i - 1];
s[i - 1] = tmp;
last = i;
}
}
}
}
int main(void)
{
const char * s[] =
{
"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"
};
const size_t N = sizeof( s ) / sizeof( *s );
for ( size_t i = 0; i < N; i++ )
{
printf( "\"%s\" ", s[i] );
}
putchar( '\n' );
bubble_sort( s, N, cmp );
for ( size_t i = 0; i < N; i++ )
{
printf( "\"%s\" ", s[i] );
}
putchar( '\n' );
return 0;
}
此时程序输出为
"zero" "one" "two" "three" "four" "five" "six" "seven" "eight" "nine"
"one" "two" "six" "zero" "four" "five" "nine" "three" "seven" "eight"
如果您愿意,可以通过以下方式简化比较函数声明
int cmp( const char *, const char * )