按字母顺序在C中排序

时间:2018-07-02 05:49:05

标签: c sorting compare character lexicographic

我不了解这种工作方式,为什么呢?以及我们如何比较C语言中的字符,我如何理解其中哪个字符比另一个字符少或多? 是从书上来的。

调用函数compareStrings 如果第一个字符串在字典上小于第二个字符串,则返回值–1;如果两个字符串相等,则返回0;如果第一个字符串在字典上大于,则返回1 比第二个字符串。因此,函数调用

compareStrings ("alpha", "altered")

返回值–1,因为第一个字符串在字典上小于第二个 字符串(认为这意味着第一个字符串出现在字典中的第二个字符串之前)。 函数调用

compareStrings ("zioty", "yucca");

之所以返回值1,是因为“辞典”在字典上大于“丝兰”。

#include <stdio.h>
#include <stdbool.h>

struct entry
{
    char word[15];
    char definition[50];
};

bool equalStrings(char s1[], char s2[])
{
    bool areEqual = false;
    int i = 0;

    while(s1[i] != '\0' && s2[i] != '\0' && s1[i] == s2[i])
        i++;

    if(s1[i] == '\0' && s2[i] == '\0')
        areEqual = true;
    else
        areEqual = false;

    return areEqual;
}

int lookup (struct entry dictionary[], char search[],int entries)
{
    int low = 0;
    int high = entries - 1;
    int mid, result;

    while (low <= high)
    {
        mid = (low + high) / 2;
        result = compareStrings (dictionary[mid].word, search);

        if(result == -1)
            low = mid + 1;
        else if(result == 1)
            high = mid - 1;
        else 
            return mid;
    }

    return -1;
}

int compareStrings(char s1[], char s2[])
{
    int i = 0, answer;

    while(s1[i] == s2[i] && s1[i] != '\0' && s2[i] != '\0')
        i++;

    if(s1[i] < s2[i])
        answer = -1;
    else if(s1[i] == s2[i])
        answer = 0;
    else 
        answer = 1;

    return answer;
}

int main()
{
    struct entry dictionary[100] = 
    {
        {"aardvark", "a burrowing African mammal" },
        {"acumen", " a bottomless pit  "},
        {"addle", "to become confused "},
        {"agar", "a jelly made from seaweed" }
        {"affix", "to append; attach"}
    };

    char word[15];
    int entries = 10;
    int entry;

    printf("Enter word: ");
    scanf("%14s", word);
    entry = lookup (dictionary, word, entries);

    if(entry != -1)
        printf("%s\n", dictionary[entry].definition);
    else
        printf("Sorry, the word %s is not in my dictionary.\n", word);

    return 0;

}

如何理解一个大于另一个?谢谢。

1 个答案:

答案 0 :(得分:2)

词典顺序类似于字典顺序,a排在b之前...……还有大小写相关的其他行为,大写字母排在小写字母之前,非字母字符也根据其编码进行比较。 / p>

此比较是逐字符进行的。如果两个字符串中的所有字符都相等,则字符串比较相等,返回值为0,否则相对顺序由第一个不匹配字符的比较确定。如果s1[i] < s2[i],字符串s1位于s2之前,则返回值为负,否则s1位于s2之后,则返回值为正。

但是请注意,这本书的实施效果欠佳,可能有误:

  • 如果s1[i] == s2[i]s1[i] != '\0',比较s2[i]'\0'是多余的。
  • 字符应与unsigned char进行比较,以便扩展字符在常规字符之后。 strcmp是用这种方式指定的。

以下是简化版本:

int compareStrings(const char *s1, const char *s2) {
    size_t i;

    for (i = 0; s1[i] == s2[i]; i++) {
        if (s1[i] == '\0')
            return 0;
    }
    if ((unsigned char)s1[i] < (unsigned char)s2[i])
        return -1;
    else
        return 1;
}

更多说明:

  • dictionary中定义的main未排序,agar应该在affix之后。 lookup函数依赖于entry结构的数组进行排序。对于某些输入单词,它可能找不到正确的条目。

  • lookup函数使用二进制搜索算法。该方法非常有效,但是实现过程中存在一个经典的错误:mid = (low + high) / 2;对于大型数组可能会溢出,从而导致未定义的行为。它应该写为:

    mid = low + (high - low) / 2;