在C中按字典顺序排序

lexicographically sort in C

我不明白这是怎么回事 sort.Why 是这样吗?以及我们如何比较 C 中的字符,我如何理解它们中的哪些比其他的少或大? 出自书本。

调用函数compareStrings 如果第一个字符串按字典顺序小于第二个字符串,则 return 值为 –1,如果两个字符串相等则为 0,如果第一个字符串按字典顺序大于第二个则为 1 比第二个字符串。所以,函数调用

compareStrings ("alpha", "altered")

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

compareStrings ("zioty", "yucca");

returns 值 1,因为“zioty”在字典序上大于“yucca”。

#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] != '[=12=]' && s2[i] != '[=12=]' && s1[i] == s2[i])
        i++;

    if(s1[i] == '[=12=]' && s2[i] == '[=12=]')
        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] != '[=12=]' && s2[i] != '[=12=]')
        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;

}

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

词典顺序就像字典顺序,a 排在 b 之前...还有区分大小写的其他行为,大写字母排在小写字母之前,非字母字符也根据它们的编码进行比较.

这个比较是一个字符一个字符地进行的。如果两个字符串中的所有字符都相等,则字符串比较相等,return值为0,否则相对顺序由比较第一个不匹配的字符决定。如果s1[i] < s2[i],字符串s1s2之前,则return值为负,否则s1s2之后,则return 值为正。

但是请注意,这本书的实现不是最优的并且可能不正确:

  • 如果 s1[i] == s2[i]s1[i] != '[=21=]',比较 s2[i]'[=23=]' 是多余的。
  • 个字符应与 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] == '[=10=]')
            return 0;
    }
    if ((unsigned char)s1[i] < (unsigned char)s2[i])
        return -1;
    else
        return 1;
}

进一步说明:

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

  • lookup 函数使用二进制搜索算法。这种方法非常有效,但实现有一个典型的错误:mid = (low + high) / 2; 可以溢出大数组,导致未定义的行为。应该写成:

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