您需要“任何”排序算法还是“高效”的排序算法?
为了简单起见,我可以向您展示如何实现一种简单但不高效的排序算法。
它是通过使用“双重循环”的方法来实现的!
然后,使用相同的思路,您可以将其修改为任何其他高效算法(如希尔排序或快速排序)。
对于数字,您可以按以下顺序放置数组(正如您可能知道的那样):
int intcmp(int a, int b) {
return (a < b)? -1: ((a > b)? +1: 0);
}
int main(void) {
int a[5] = {3, 4, 22, -13, 9};
for (int i = 0; i < 5; i++) {
for (int j = i+1; j < 5; j++)
if (intcmp(a[i], a[j]) > 0) {
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
printf("%d ", a[i]);
}
}
现在唯一改变的是你有了字符串而不是整数。因此,你需要考虑一个字符串数组:
char *a[] = {"Florida", "Oregon", "Califoria", "Georgia"};
然后,您需要将
temp
的类型更改为
char*
,最后将函数
intcmp()
替换为
strcmp()
。
函数strcmp(s1, s2)
(来自<string.h>)返回一个数字。如果s1是一个“小于”s2的字符串,则返回<0;如果s1与s2“相等”,则返回==0;否则返回>1。
程序看起来像这样:
#include <stdio.h>
#include <string.h>
int main(void) {
char *a[] = {"Florida", "Oregon", "Califoria", "Georgia"};
for (int i = 0; i < 4; i++) {
for (int j = i+1; j < 4; j++)
if (strcmp(a[i], a[j]) > 0) {
char* temp = a[i];
a[i] = a[j];
a[j] = temp;
}
printf("%s ", a[i]);
}
getchar();
return 0;
}
请注意,在
printf()
语句中,我们将
"%d "
更改为
"%s "
,以便正确显示字符串。
最后的评论:当您编写更好的算法(例如快速排序)时,只需更改比较函数即可,因为算法相同,无论您要比较的数据类型如何。
请注意,我使用了一个“巧妙”的方法。正如您所看到的,我已将变量
a
定义为一个
指向字符串的指针。初始化器使用了一个常量字符串数组,然后用它初始化了变量
a
。现在,变量
a
可以安全地作为一个由4个指向字符串的指针组成的数组来处理和索引。
这就是为什么双重循环算法中的“交换”可以正常工作的原因:交换的是内存地址而不是整个字符串。