我已经编写了一个基本的冒泡排序程序,它使用来自预定数组或字符的给定输入,但是我想对它进行更改,以便对字符串进行排序。另外,我不想按字母顺序排序,而是按字符串长度排序。
我source.c
void sort(char array[], int size) {
for (int i = 0; i < size - 1; i++) {
for (int j = 0; j < size - i - 1; j++) {
if (array[j] > array[j + 1]) {
int temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
}
void printArray(char array[], int size) {
for (int i = 0; i < size; i++) {
printf("%c ", array[i]); //%c -> %s
}
}
int main(void) {
char array[] = { 'F', 'A', 'D', 'B', 'C' };
//char string[][] = { "hey", "Hello", "awesome" };
int size = sizeof(array) / sizeof(array[0]);
sort(array, size);
printArray(array, size);
return 0;
}
我曾试图使int main(void)
中的char array[];
作为char string[][];
的字符串数组并试图做出相应的改变,但我一直失败(构建错误)。我也不明白如何将其更改为按字符串长度排序,而不是按字母顺序排序
对于初学者来说,要注意你的函数实现是低效的,因为它的嵌套循环将对一个已经排序的数组执行多次。也就是说,该函数没有考虑到数组的一部分(或整个数组)已经排序。
如果你想按某些条件对数组进行排序,那么你应该用一个参数声明该函数,该参数将指定一个类似于标准C函数qsort
的比较函数。
提供不同的函数,您可以使用不同的比较规则对相同的数组进行排序。
你总是应该写更多的通用函数。
下面是一个演示程序,展示了如何为二维字符数组编写这样一个实现冒泡排序方法的函数。
#include <stdio.h>
#include <string.h>
enum { N = 6 };
void bubble_sort( char s[][N], size_t n, int cmp( const void *, const void * ) )
{
for (size_t sorted = 1; !( n < 2 ); n = sorted)
{
for (size_t j = sorted = 1; j < n; j++)
{
if (cmp( &s[j], &s[j - 1] ) < 0)
{
char tmp[N];
strcpy( tmp, s[j] );
strcpy( s[j], s[j - 1] );
strcpy( s[j - 1], tmp );
sorted = j;
}
}
}
}
static int by_length( const void *a, const void *b )
{
char ( *s1 )[N] = ( char( * )[N] )a;
char( *s2 )[N] = ( char( * )[N] )b;
size_t n1 = strlen( *s1 );
size_t n2 = strlen( *s2 );
return ( n2 < n1 ) - ( n1 < n2 );
}
static int lexicographically( const void *a, const void *b )
{
char( *s1 )[N] = ( char( * )[N] )a;
char( *s2 )[N] = ( char( * )[N] )b;
return strcmp( *s1, *s2 );
}
int main( void )
{
char s[][N] =
{
"One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten"
};
const size_t M = sizeof( s ) / sizeof( *s );
for (size_t i = 0; i < M; i++)
{
printf( ""%s" ", s[i] );
}
putchar( 'n' );
bubble_sort( s, M, by_length );
for (size_t i = 0; i < M; i++)
{
printf( ""%s" ", s[i] );
}
putchar( 'n' );
bubble_sort( s, M, lexicographically );
for (size_t i = 0; i < M; i++)
{
printf( ""%s" ", s[i] );
}
putchar( 'n' );
}
程序输出为
"One" "Two" "Three" "Four" "Five" "Six" "Seven" "Eight" "Nine" "Ten"
"One" "Two" "Six" "Ten" "Four" "Five" "Nine" "Three" "Seven" "Eight"
"Eight" "Five" "Four" "Nine" "One" "Seven" "Six" "Ten" "Three" "Two"
如果你的编译器支持可变长度数组,你甚至可以写一个更通用的函数。
例如,在这种情况下,函数声明可以像
void bubble_sort( size_t m, size_t n, char s[m][n], int cmp( const void *, const void * ) )
您需要将sort()
和printArray()
更改为字符串数组。然后将比较函数更改为使用strlen()
来查找相同的内容。你可以对数组进行预处理,一次获得所有的大小,而不是n^2次。这与小输入无关。我按大小(<
)对其进行反向排序,因为输入数组已经通过增加大小进行排序:
#include <stdio.h>
#include <string.h>
void sort(size_t size, char *array[size]) {
for (int i = 0; i < size - 1; i++) {
for (int j = 0; j < size - i - 1; j++) {
if (strlen(array[j]) < strlen(array[j + 1])) {
char *temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
}
void printArray(size_t size, char *array[size]) {
for (int i = 0; i < size; i++) {
printf("%s ", array[i]); //%c -> %s
}
}
int main(void) {
char *array[] = { "hey", "Hello", "awesome" };
size_t size = sizeof array / *sizeof array[0];
sort(size, array);
printArray(size, array);
}
示例运行:
awesome Hello hey