您需要“任何”排序算法还是“高效”排序算法?
为简单起见,我可以向您展示如何实现一个简单但不高效的排序算法。是double for
方法!!然后,使用相同的想法,您可以将其修改为任何其他有效的算法(如 shell 或快速排序)。
对于数字,您可以将数组按顺序排列,如下所示(您可能知道):
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*
,
最后将函数strcmp()
替换为intcmp()
。
strcmp(s1, s2)
如果 s1 是“小于”s2 的字符串,则该函数(来自 < string.h >)返回一个数字 < 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
为指向 string的指针。初始化程序采用了一个常量字符串数组,然后a
用它初始化变量。该变量a
现在可以被安全地处理和索引为正好 4 个指向字符串的数组。
这就是为什么“交换”在双换算法中可以正常工作的原因:内存地址被交换而不是整个字符串。