在C中按字母顺序排序单词

时间:2017-07-08 05:09:40

标签: c

以下代码适用于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

结果是正确的,但系统会注意到失败信息“字典上的性能测试:超出时间限制”

为什么会出现此错误以及如何解决此问题?谢谢!

3 个答案:

答案 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