许多排序算法都是基于数字的比较。如果我正确理解,当我们使用比较算法进行字母排序时,我们会比较char代码(它们的整数表示)并根据它们的值进行排序。 (这就是为什么在ASCII
表格B
有一个更大的代码然后A
)。但在这种比较中,我们只按第一个字母而不是整个单词排序。当我们将db query
与ORDER BY
一起使用时,我们会对整个单词进行排序。 (据我所知,它的原因是db后台机制,如索引等)。我也听说过Radix sort
(对不起,但之前从未使用过它),我可以看到它可以帮助按字母排序(也许我错了)。
哪种算法更适合用于整个单词的排序?
不正确:
Adam
Aaron
Antony
正确:
Aaron
Adam
Antony
我对整个工作流程的假设是否正确?
答案 0 :(得分:7)
关于“仅比较第一个字母”的假设,你不太正确。算法是 - 如果第一个字母相同,则比较下一个字母。接下来。接下来。直到你找到一些不同的字母,或者其中一个字符串耗尽。
另请注意,仅通过ASCII代码进行比较并不总是足够的。有时,您需要对A
等于a
进行不区分大小写的比较。有时您需要对ā
等于a
进行重音不敏感的比较。有时,您需要考虑ß
等于ss
或更差的疯狂语言错误。
我的建议是 - 你的编程语言应该有一些比较字符串的机制。用那个。不要推出自己的。
之后,任何排序算法都会起作用。它们都使用一个简单的假设 - 您可以比较您排序的项目。它们是整数,字符串还是复杂对象是无关紧要的。只要你可以拍摄任何两个物体并说“这个物体更大而且这个物体更小”,你就可以去了。
(另请注意,您需要保持一致。如果A == B且B == C,那么您还需要确保A == C.类似地,如果A< B和B< C ,那么你必须A< C. Etc。)
答案 1 :(得分:4)
不,排序不是基于第一个字符或长度。字母顺序或更好地将其作为词典排序按以下方式完成,
在C ++中,比较函数看起来像这样,
bool operator<(const string &a, const string &b){
int l = min(a.size(),b.size());
for(int i = 0; i < l; i++){
if( a[i] > b[i]) return false; // a is greater than b
if( b[i] > a[i]) return true; // b is greater than a
}
if ( a.size() > l) return false; // a is greater than b
return true; // b is greater than a
}
答案 2 :(得分:1)
如果提供了正确的比较功能,则每个排序算法都有效。
只需确保元素之间的比较比较整个字符串,而不是在实现您喜欢的排序算法时调用第一个字符或调用您选择的排序库函数。
答案 3 :(得分:1)
正如您已经提到的,排序字符串而不是数字之间的唯一区别是几乎所有排序算法都使用的compare
方法(Radix-sort,bucket-sort是例外)。
大多数情况下,最快的排序算法之一是快速排序。
答案 4 :(得分:1)
您只需要实现任何排序算法可以使用的比较功能。在比较功能中,您将根据需要逐个字母地比较整个单词。