Arrays d排序数组的排序算法

Arrays d排序数组的排序算法,arrays,algorithm,insertion-sort,Arrays,Algorithm,Insertion Sort,请帮助理解以下算法的运行时间 我已经对数组进行了排序(每个数组有超过1个元素),总共有n个元素。 我想要一个大小为n的排序数组 如果我没有弄错的话,插入排序在部分排序的数组上线性运行 如果我将此d数组连接到一个n元素数组中,并使用插入排序对其排序 它不是一个部分排序的数组,并且在这个数组上插入排序的运行时间不会是O(n) 插入排序对于较小的值N是相当(相对)线性的。如果N较大,则您的性能更可能是N^2 我相信,如果N足够大,子数组是sort的事实将不会有多大帮助 t是部分排序数组的一个很好的候选

请帮助理解以下算法的运行时间
我已经对数组进行了排序(每个数组有超过1个元素),总共有n个元素。
我想要一个大小为n的排序数组
如果我没有弄错的话,插入排序在部分排序的数组上线性运行
如果我将此d数组连接到一个n元素数组中,并使用插入排序对其排序
它不是一个部分排序的数组,并且在这个数组上插入排序的运行时间不会是O(n)

插入排序对于较小的值N是相当(相对)线性的。如果N较大,则您的性能更可能是N^2

我相信,如果N足够大,子数组是sort的事实将不会有多大帮助


t是部分排序数组的一个很好的候选者

否,这将需要二次时间。插入排序仅当每个元素与排序数组中的点之间的距离最多为常数d时才是线性的,在这种情况下需要O(nd)个时间,这就是部分排序的意思。你没有那种保证


只有在子阵列的数量保证为一个小常数的假设下,才能在线性时间内执行此操作。在这种情况下,您可以使用插入排序为

O(n²),即使原始数组是几个预排序数组的串联。您可能需要使用将多个排序数组组合成一个排序数组。这将为您提供O(n·ln(d))性能

如果已知数组已排序,则只需将每个数组视为一个队列,对“头”进行排序,选择要放入新数组中的最小头,然后从其数组中“弹出”所选值即可

如果D很小,那么简单的冒泡排序可以很好地对头部进行排序,否则应该使用某种插入排序,因为只需要将一个元素放入顺序中


我相信这基本上是一种“合并排序”。当要排序的列表超过工作存储空间时非常有用,因为您可以先对较小的列表进行排序,而无需搅动,然后使用很少的工作存储空间进行合并。

在部分排序的数组上插入排序的运行时间不是线性的吗?如果我连接这个数组,它不会被部分排序?是的,但是在你的例子中,整个数组不是部分排序的,只是“子”部分。换句话说,如果只有几个条目不合适,那么插入排序是不错的——但在你的例子中,你有部分已经排序了——但“整体”仍然相对未排序。我认为这:很有教育意义(对我来说是:-)@MAB:没关系,我犯了一个错误。请查看更新的答案。