以下代码适用于https://www.testdome.com/for-developers/solve-question/9621
中给出的测试样本问题是: 实现函数sort_words,可以按英文字母顺序对包含小写字符的单词数组进行排序。
例如,数组{“cherry”,“orange”,“apple”}在排序后应成为{“orange”,“cherry”,“apple”}。
我的代码是:
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
void sort_words(char *words[], int count)
{
char *x;
for (int i = 0; i<count; i++)
{
for (int j = i + 1; j<count; j++)
{
if ((char)(*words[i]) < (char)(*words[j]))
{
x = words[j];
words[j] = words[i];
words[i] = x;
}
}
}
}
#ifndef RunTests
int main()
{
char *words[] = { "cherry", "orange", "apple" };
sort_words(words, 3);
for (int i = 0; i < 3; i++)
{
printf("%s ", words[i]);
}
}
#endif
结果是正确的,但系统会注意到失败信息“字典上的性能测试:超出时间限制”
为什么会出现此错误以及如何解决此问题?谢谢!
答案 0 :(得分:3)
上面的代码看起来很有效,但实际上是错误的。
如果输入集是:
orange oyster cherry apple
然后输出是:
oyster orange cherry apple
但预期的输出是:
if ((char)(*words[i]) < (char)(*words[j]))
原因在于你的排序算法这个条件:
string
基本上只是比较两个字符数组的第一个字母。
注意:这不是C ++,数据不存储在C ++中的<
数据类型中。重载strcmp()
运算符以比较两个字符串。
因此,您可以使用if (strcmp(words[i], words[j]) < 0)
代替那一行,如下所示:
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
void sort_words(char *words[], int count)
{
char *x;
for (int i = 0; i<count; i++)
{
for (int j = i + 1; j<count; j++)
{
if (strcmp(words[i], words[j]) < 0)
{
x = words[j];
words[j] = words[i];
words[i] = x;
}
}
}
}
#ifndef RunTests
int main()
{
char *words[] = { "cherry", "orange", "apple", "oyester"};
sort_words(words, 4);
for (int i = 0; i < 4; i++)
{
printf("%s ", words[i]);
}
printf ("\n");
}
#endif
这是您的工作代码:
oyester orange cherry apple
输出:
{{1}}
答案 1 :(得分:2)
这是因为您使用的算法在时间复杂度方面效率不高。你使用它是非常微不足道的。毫无疑问,它会对输入进行排序,但是当输入数据集很大时会产生很多时间。尝试使用其他排序算法,如 - mergesort, quicksort,
等。这些算法将在较短的时间内完成相同的工作。
请参考这些算法如何工作并尝试实施它们 - https://www.tutorialspoint.com/data_structures_algorithms/sorting_algorithms.htm
答案 2 :(得分:0)
你可以使用c标准库函数qsort()来击败它.... 我的代码如下:
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int compare_c_str(const void * str1, const void * str2)
{
return strcmp(*(char **)str2,*(char **)str1);
}
void sort_words(char *words[], int count)
{
// Waiting to be implemented
qsort(words,count, sizeof(words[0]),compare_c_str);
}
#ifndef RunTests
int main()
{
char *words[] = { "cherry", "orange", "apple" };
sort_words(words, 3);
for (int i = 0; i < 3; i++)
{
printf("%s ", words[i]);
}
}
#endif