Algorithm 在哪里使用哪种排序算法?

Algorithm 在哪里使用哪种排序算法?,algorithm,sorting,quicksort,mergesort,stable-sort,Algorithm,Sorting,Quicksort,Mergesort,Stable Sort,有多种排序算法可用。时间复杂度为O(n^2)的排序算法可能适用于O(nlogn),因为它已经就位或是稳定的。例如: 对于有些排序的东西,插入排序是好的 对几乎排序的数组应用快速排序是愚蠢的 堆排序适用于O(nlogn),但不稳定 合并排序不能用于嵌入式系统,因为在最坏的情况下,它需要O(n)的空间复杂度 我想知道哪种排序算法适用于什么条件 哪种排序算法最适合按字母顺序对名称进行排序 哪种排序算法最适合排序较少的整数 哪种排序算法最适合对较小的整数进行排序,但范围可能较大(98767–673

有多种排序算法可用。时间复杂度为O(n^2)的排序算法可能适用于O(nlogn),因为它已经就位或是稳定的。例如:

  • 对于有些排序的东西,插入排序是好的
  • 对几乎排序的数组应用快速排序是愚蠢的
  • 堆排序适用于O(nlogn),但不稳定
  • 合并排序不能用于嵌入式系统,因为在最坏的情况下,它需要O(n)的空间复杂度
我想知道哪种排序算法适用于什么条件

  • 哪种排序算法最适合按字母顺序对名称进行排序
  • 哪种排序算法最适合排序较少的整数
  • 哪种排序算法最适合对较小的整数进行排序,但范围可能较大(98767–6734784)
  • 哪种排序算法最适合对数十亿个整数进行排序
  • 在空间和时间都受到限制的嵌入式系统或实时系统中,哪种排序算法最适合排序

请为这些类型的比较推荐这些/其他情况、书籍或网站。

好吧,没有银弹——但这里有一些经验法则:

  • 当元素范围(设为
    U
    )与元素数量(
    U)相比相对较小时,基数排序/计数排序通常比较好
    合并排序不能在嵌入式系统中使用,因为在最坏的情况下是这样的
    需要O(n)的空间复杂度

    您可能对C++中的 Stable排序> /COD>函数感兴趣。它试图为正则归并排序分配额外的空间,但如果失败,则会执行具有较低时间复杂度的就位稳定合并排序(<代码> n*((log n)^ 2)< />代码>而不是<代码> n*(log n)< />代码>如果你能阅读C++,你可以在你最喜欢的标准库中查看实现,否则我希望你能找到一些用语言不可知的术语解释的细节。 有大量关于就地稳定排序(尤其是就地合并)的学术文献

    在C++中,经验法则很容易,“使用<代码> STD::Stable排序> 如果你需要一个稳定的排序,否则使用<代码> STD::排序”,Python使它变得更容易,经验法则是“使用<代码>排序< < /代码>”。 一般来说,你会发现很多语言都有相当聪明的内置排序算法,你可以在大多数时候使用它们。很少需要实现自己的算法来打败标准库。如果你真的需要实现自己的算法,那么除了拿出课本,实现一些算法之外,真的没有什么替代品使用尽可能多的技巧,并针对您担心的特定情况相互测试它们,您需要击败库函数

    在回答这个问题时,您可能希望得到的大多数“明显”的建议已经包含在一种或多种常见编程语言的内置排序函数中。但要回答您的具体问题:

    哪种排序算法最适合按字母顺序对名称进行排序

    一个基数排序可能会将标准比较类(如C++ +代码>排序< /COD>)边缘化,但是如果您使用“适当的”排序规则来命名,则可能是不可能的。例如,“McAlister”以前是按字母顺序排列的,与“Maalistor”相同,而“S.John”则称为“Saint John”。。但后来程序员们来了,他们只想按ASCII值排序,而不是编写许多特殊规则,因此大多数计算机系统不再使用这些规则。我发现周五下午是使用这种功能的好时机;-)如果对“规范化”的字母进行排序,仍然可以使用基数排序名称而不是实际名称

    英语以外语言的“适当”排序规则也很有趣。例如,在德语中,“Grüber”排序类似于“Grueber”,因此在“Gruber”之后,但在“Gruhn”之前。在英语中,“Llewellyn”是在“Lewis”之后出现的,但我相信威尔士语(使用完全相同的字母表,但不同的传统排序规则)是在“Lewis”之前出现的

    因此,谈论优化字符串排序比实际操作更容易。“正确”排序字符串需要能够插入特定于区域设置的排序规则,如果您不再使用比较排序,则可能需要重新编写所有排序规则代码

    哪种排序算法最适合排序较少的整数

    对于少量的小值,可能是计数排序,但是当数据足够小(20-30个元素)时,带切换到插入排序的Introsort是非常好的。当数据不是随机的时候,Timsort特别好

    哪种排序算法最适合对较小的整数进行排序,但范围可能较大(98767–6734784)

    大范围排除了计数排序,因此对于少量范围广泛的整数,可以使用Introsort/Timsort

    哪种排序算法最适合对数十亿个整数进行排序

    如果你所说的“数十亿”是指“太多而无法放入内存”,那么这就稍微改变了游戏。可能您希望将数据分成适合内存的块,对每个块进行Intro/Tim排序,然后进行外部合并。如果你在一个64位的机器上排序32位整数,你可以考虑计数排序。 在空间和时间都受到限制的嵌入式系统或实时系统中,哪种排序算法最适合排序

    可能是内向

    对于有些排序的东西,插入排序是好的

    没错,Timsort也利用了同样的情况

    对几乎排序的数组应用快速排序是愚蠢的

    错。没有人使用霍尔最初发布的简单快速排序,你可以选择更好的枢轴,使杀手案例比“排序数据”明显得多。要彻底处理不良案件,有必要进行分类

    堆排序适用于O(nlogn),但不适用于stabl