【问题标题】:Which algorithm to use for alphabetical sort?使用哪种算法进行字母排序?
【发布时间】:2013-11-25 08:46:48
【问题描述】:

很多排序算法都是基于数字的比较。如果我正确理解,当我们使用比较算法进行字母排序时,我们会比较字符代码(它们的整数表示)并根据它们的值进行排序。 (这就是为什么ASCII 表信B 的代码比A 更大)。但是在这个比较过程中,我们只按第一个字母而不是整个单词排序。当我们使用db queryORDER BY 时,我们正在对整个单词进行排序。 (据我了解,它的原因是数据库背景机制,如索引等)。我还听说过Radix sort(抱歉,以前从未使用过),我可以看到它可以帮助按字母排序(也许我错了)。

什么算法更适合按整个单词排序?

不正确:

Adam
Aaron
Antony

正确:

Aaron
Adam
Antony

我对整个工作流程的假设是否正确?

【问题讨论】:

  • 快速排序、堆排序等其他算法面临的问题是什么?
  • “但是在这个比较过程中,我们只按第一个字母而不是整个单词排序” – 不……如果两个单词的第一个字母相同,那么比较继续第二个字母,依此类推。

标签: algorithm sorting alphabetical


【解决方案1】:

您对“仅比较第一个字母”的假设并不完全正确。该算法是 - 如果第一个字母相同,则比较下一个字母。接下来。接下来。直到找到一些不同的字母,或者其中一个字符串用完为止。

还请注意,仅通过 ASCII 代码进行比较并不总是足够的。有时您需要进行不区分大小写的比较,您认为A 等于a。有时您需要进行不区分重音的比较,您认为ā 等于a。有时您需要考虑到 ß 等于 ss 或更糟的疯狂语言问题。

我的建议是——你的编程语言应该有一些比较字符串的机制。用那个。不要推出自己的。

之后,任何排序算法都将起作用。他们都使用一个简单的假设 - 您可以比较您排序的项目。无论它们是整数、字符串还是复杂对象,都无关紧要。只要你可以拿任意两个物体说“这个大一点,这个小一点”,就可以了。

(还要注意,你需要保持一致。如果 A==B 和 B==C,那么你还需要确保 A==C。同样如果 A

【讨论】:

  • 不正确,比较 ASCII 就足够了,因为大写和小字符有单独的 ASCII 码。
【解决方案2】:

不,排序不是基于第一个字符或长度。按字母顺序或更好的按字典顺序按以下方式完成,

在 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
}

【讨论】:

    【解决方案3】:

    每个排序算法都有效,如果提供正确的比较函数。

    当您实现您最喜欢的排序算法或调用您选择的排序库函数时,请确保元素之间的比较是比较整个字符串,而不是只查看第一个字符。

    【讨论】:

      【解决方案4】:

      正如您已经提到的,排序字符串而不是数字之间的唯一区别是几乎所有排序算法都使用compare 方法(基数排序、桶排序是例外)。 大多数时候,最快的排序算法之一是快速排序。

      【讨论】:

        【解决方案5】:

        你只需要实现任何排序算法都可以使用的比较函数。在该比较功能中,您将根据需要逐个字母地比较整个单词。

        【讨论】:

        • 我不建议对字符串进行比较。除了在未来几年需要爱好的非常注重细节的人。使用你的运行时已经拥有的那些——Vilx 已经列出了一些问题,甚至没有开始谈论对你的应用程序可能重要或不重要的语言环境依赖项。
        猜你喜欢
        • 2011-11-14
        • 2017-11-19
        • 1970-01-01
        • 1970-01-01
        • 2010-10-25
        • 2011-11-02
        • 2013-08-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多