在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]
,字符串s1
在s2
之前,则return值为负,否则s1
在s2
之后,则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;
我不明白这是怎么回事 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]
,字符串s1
在s2
之前,则return值为负,否则s1
在s2
之后,则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;