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_Mergesort_Insertion Sort - Fatal编程技术网

Algorithm 为什么插入排序与合并排序一起使用?

Algorithm 为什么插入排序与合并排序一起使用?,algorithm,sorting,mergesort,insertion-sort,Algorithm,Sorting,Mergesort,Insertion Sort,我在一些解释和一些库(例如Java)中看到,在这些库中,指定数量的阈值元素插入排序与合并排序一起使用。其原因是插入排序也是稳定的。然而,冒泡排序或Tim排序也是稳定的,当然可能还有其他排序。我想知道为什么使用插入排序来代替其他方法。插入排序通常比其他简单的二次排序方法快一点-部分原因是使用元素链移位而不是完全交换 对于小的子数组,简单的排序通常比像TimSort这样更复杂的方法更快,不是100%,但如果我记得正确的话,这与插入排序在理论上至少比冒泡排序少sqap的时间有关。排序算法设计人员对少量

我在一些解释和一些库(例如Java)中看到,在这些库中,指定数量的阈值元素插入排序与合并排序一起使用。其原因是插入排序也是稳定的。然而,冒泡排序或Tim排序也是稳定的,当然可能还有其他排序。我想知道为什么使用插入排序来代替其他方法。

插入排序通常比其他简单的二次排序方法快一点-部分原因是使用元素链移位而不是完全交换


对于小的子数组,简单的排序通常比像TimSort这样更复杂的方法更快,不是100%,但如果我记得正确的话,这与插入排序在理论上至少比冒泡排序少sqap的时间有关。

排序算法设计人员对少量元素和将它们集成为高效阵列的引导程序。

显然是“因为它对于小型阵列更快”

它之所以更快,最基本的原因是CPU对无法预测答案的选择有巨大的惩罚。这些被称为管道暂停。插入排序最大限度地减少管道暂停

有效的排序有很多非此即彼的问题,甚至有机会以任何一种方式出现。因此,例如,在快速排序中,有一半的比较预测是错误的。因此,例如,对于100个元素,我们预计需要大约650个比较(实际上平均647.85,公式见第12页),其中325个管道暂停的平均一半预测是错误的

插入排序有很多预测,但是它们的结果是可以预测的——我们还没有到达插入点。因此,对于100个元素,我们将平均进行2500次比较,但其中只有99次是管道暂停。如果管道暂停的成本远远超过10次比较,那么插入排序就会更快。根据您可以看到,获取一个要比较的数字大约为.5ns,而分支预测失误(也称为管道暂停)大约为5ns,因此差异大约为10倍。这就是为什么在插入排序实际上比快速排序快的点附近有100个元素


气泡排序在这个指标上做得不好。我们都有二次数量的比较和二次数量的管道暂停。但这并不奇怪。气泡排序的主要目的是制作一个方便的打孔袋,因为它很容易编码,而且吸力很差。

因为Tim sort本身是一种混合排序算法,对较小的部分使用插入排序,为什么你认为你想用它来代替插入排序?@Damien_The_The_unsiver实际上我想知道为什么不使用冒泡排序而不是插入排序?100?根据我的经验,它接近15或20。我想这取决于硬件。@JimMischel它取决于硬件和数据类型以及抽奖的运气。插入排序的最佳情况是比较小整数。但如果您有小字符串,插入排序将做得更糟。