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位整数),则开始有可能使用各种基数排序