Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 我在什么情况下使用这些排序算法?_Algorithm_Sorting_Implementation - Fatal编程技术网

Algorithm 我在什么情况下使用这些排序算法?

Algorithm 我在什么情况下使用这些排序算法?,algorithm,sorting,implementation,Algorithm,Sorting,Implementation,我知道大多数算法的实现,但我不知道使用它们的数据集大小(以及包含的数据): 合并排序 气泡排序(我知道,不经常) 快速排序 插入排序 选择排序 基数排序 使用与数组大小相等的额外空间不是问题 仅在非常小的数据集上 如果需要就地排序,则不需要稳定排序 仅在非常小的数据集上,或者如果数组已经被排序的概率很高 仅在非常小的数据集上 当值与项目数比率的范围较小时(建议进行实验) 请注意,对于子数组非常小的子例程部分,通常合并或快速排序实现使用插入排序。首先,将所有具有O(n2)复杂性的排序算法丢弃 然后

我知道大多数算法的实现,但我不知道使用它们的数据集大小(以及包含的数据):

  • 合并排序
  • 气泡排序(我知道,不经常)
  • 快速排序
  • 插入排序
  • 选择排序
  • 基数排序
  • 使用与数组大小相等的额外空间不是问题
  • 仅在非常小的数据集上
  • 如果需要就地排序,则不需要稳定排序
  • 仅在非常小的数据集上,或者如果数组已经被排序的概率很高
  • 仅在非常小的数据集上
  • 当值与项目数比率的范围较小时(建议进行实验)

  • 请注意,对于子数组非常小的子例程部分,通常合并或快速排序实现使用插入排序。

    首先,将所有具有
    O(n2)
    复杂性的排序算法丢弃

    然后,您必须研究排序算法的一些特性,并确定它们中的每一个是否更适合您要解决的问题。最重要的是:

    算法到位了吗?这意味着排序算法不使用任何(
    O(1)
    实际上)额外内存。在运行内存关键型应用程序时,这种适当性非常重要

    冒号排序、插入排序和选择排序使用恒定内存。 合并排序也有一个就地变量

    算法稳定吗?这意味着,如果给定比较方法,两个元素
    x
    y
    相等,并且在输入中
    x
    y
    之前,那么在输出中
    x
    将在
    y
    之前找到

    合并排序、冒泡排序和插入排序是稳定的

    算法可以并行化吗?如果您正在构建的应用程序可以使用并行计算,您可能希望选择可并行化的排序算法


    更多信息。

    仅当要排序的数据存储在转鼓存储器中时,才使用气泡排序。它是用于该目的的最佳选择,但不是用于随机访问内存。如今,这相当于“不要使用冒泡排序”

    使用“插入排序”或“选择排序”,使其达到您通过与其他可用排序进行比较来确定的大小。这通常是约20-30个项目,但YMMV。特别是,在实现诸如合并排序和快速排序之类的分治排序时,当当前数据块足够小时,应该“突破”到插入排序或选择排序

    还可以对几乎已排序的数据使用插入排序,例如,如果您不知何故知道您的数据曾经被排序过,并且此后没有太大变化

    在需要稳定排序时使用合并排序(在对链表排序时也很好),注意数组会占用大量额外内存

    通常,您根本不使用“普通”快速排序,因为即使使用智能选择的枢轴,它仍然有
    Omega(n^2)
    最坏情况,但与插入排序不同,它没有任何有用的最佳情况。“杀手”案例可以系统地构建,因此,如果您对“不受信任”的数据进行排序,则某些用户可能会故意破坏您的性能,而且可能存在某些特定领域的原因,导致您的数据接近杀手案例。如果你选择随机支点,那么致命病例的概率可以忽略不计,所以这是一种选择,但通常的方法是“IntroSort”——一种检测坏病例并切换到HeapSort的快速排序

    基数排序有点奇怪。很难找到最适合的常见问题,但它对固定宽度数据有很好的渐近极限(
    O(n)
    ,其中比较排序是
    Omega(n logn)
    )。如果您的数据是固定宽度的,并且输入大于可能值的数量(例如,超过40亿个32位整数),则开始有可能使用各种基数排序