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 为什么插入排序的O(n)nlogn运行时是理想的?_Algorithm_Sorting_Runtime_Big O_Insertion Sort - Fatal编程技术网

Algorithm 为什么插入排序的O(n)nlogn运行时是理想的?

Algorithm 为什么插入排序的O(n)nlogn运行时是理想的?,algorithm,sorting,runtime,big-o,insertion-sort,Algorithm,Sorting,Runtime,Big O,Insertion Sort,我们在课堂上学习到,对于所有其他情况,插入排序都是omega线性运行时(如果传递的是已排序的数组)和Big-O(n^2)。然后,我们的教授开始讨论使用“合并排序”方法的插入排序的理想情况,理想情况是使用合并排序并具有O(nlogn)运行时?他不是一个很清楚的人。。。完全你能解释一下他的意思吗 我可能对你的教授可能是什么意思有所了解。对于阶数非常小的数组(或者只是为了查看数组是否已排序),运行插入排序可能是有意义的,因为它不消耗辅助空间,而是在线性时间内运行。在这之后,您将运行一个合并排序,它将平

我们在课堂上学习到,对于所有其他情况,插入排序都是omega线性运行时(如果传递的是已排序的数组)和Big-O(n^2)。然后,我们的教授开始讨论使用“合并排序”方法的插入排序的理想情况,理想情况是使用合并排序并具有O(nlogn)运行时?他不是一个很清楚的人。。。完全你能解释一下他的意思吗

我可能对你的教授可能是什么意思有所了解。对于阶数非常小的数组(或者只是为了查看数组是否已排序),运行
插入排序
可能是有意义的,因为它不消耗辅助空间,而是在线性时间内运行。在这之后,您将运行一个合并排序,它将平均一个
nlog(n)
,而不管条件如何(除非您使用的是自然合并排序,在这种情况下,您的最佳情况归结为O(n),运行插入排序算法的意义更小),并消耗O(n)的空间和辅助空间

尽管如此,可能值得注意的是,像Java这样的语言使用了双枢轴快速排序算法,而不是合并排序(最坏情况下的快速排序是O(n^2))。我不能完全确定这一点,但这可能是因为快速排序使用的辅助空间较少,但更多,因为数组遇到最坏情况的情况并不常见

O(N)被认为是快的,O(N Log(N))是公平的,O(N²)是慢的

对于少数元素,您可能不关心。但是想一想一百万个元素的排序:时间将与1000000(比如说1ms)、20000000(20ms)和。。。1000000000000(11周)

这就是为什么通常避免使用O(N²)排序算法,因为知道O(N Log(N))在所有情况下都是可能的,而O(N)在某些配置中是可能的。

让我们看看

插入排序有O(n^2)个运行时

很明显,插入排序在O(n^2)上运行。你可以阅读更多关于它的内容

然后,我们的教授开始讨论插入排序的理想方法,即“合并排序”方法

我想你想说的是
idea
,而不是
ideal
。让我们看看这个关于插入排序的
idea
,它采用了“合并排序”方法。合并排序的基础来自分治范式。假设我有这个数组

654321

使用“合并排序”方法进行插入排序将使该数组基于分治范式分成两个区域(或更多个区域)

6 5 4 | 3 2 1

之后,我们可以在区域的每一侧应用插入排序,然后使用征服将它们连接起来

4 5 6 | 1 2 3

123456

嗯,现在让我们来看看<强>如果我们将Delphi应用到数组的每个元素。

6 | 5 | 4 | 3 | 2 | 1

等一下,这不是合并吗?
是的,这就是为什么你的老师说

理想情况是使用合并排序,并有一个O(n logn)运行时


实际上,当一些阈值被激活时(比如只有7个元素),合并排序的一些实现使用了插入排序。您可以阅读。

对于一般情况,合并排序的运行时间比插入排序*好*(快)。也许他说合并排序更好,仅此而已?