为什么插入类型的O(n)nlogn运行时间是理想的?

时间:2016-03-16 06:58:16

标签: algorithm sorting runtime big-o insertion-sort

我们在课堂上学习插入排序是omega线性运行时间(如果传递已经排序的数组)和Big-O O(n ^ 2)用于所有其他情况。然后,我们的教授开始关于插入排序的理想,其中包含"合并排序"方法,理想的是使用合并排序并具有O(nlogn)运行时间?他根本不是一个非常清楚的人。你能解释一下他的意思吗?

3 个答案:

答案 0 :(得分:1)

O(N)被认为是快速的,O(N Log(N))是公平的,O(N 2)是慢的。

对于少数元素,您可能不在乎。但想想一下排序一百万个元素:时间与1000000(比如1毫秒),20000000(20毫秒)和...... 1000000000000(11周)成正比。

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

答案 1 :(得分:1)

让我们看看。

  

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

很明显,插入排序在O(n ^ 2)上运行。您可以阅读更多相关信息here

  

然后我们的教授开始关于插入排序的理想,其中包含"合并排序"方法

我认为您试图说idea而不是ideal。让我们看看idea插入排序有"合并排序"做法。合并排序的基础来自分而治之的范式。所以我们假设我有这个数组

  

6 5 4 3 2 1

使用"合并排序"进行插入排序方法将该阵列分为两个区域(或更多)基于分而治之的范式。

  

6 5 4 | 3 2 1

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

  

4 5 6 | 1 2 3

     

1 2 3 4 5 6

好了,现在让我们来看看 IF ,我们对数组的每个元素应用除法。

  

6 | 5 | 4 | 3 | 2 | 1

等待合并排序?是的,这就是为什么你的老师说

  

理想情况是使用合并排序并具有O(n log n)运行时间

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

答案 2 :(得分:0)

我可能对你的教授可能意味着什么有所了解。对于非常小的订单数组(或简单地查看数组是否已排序),运行insertion sort可能有意义,因为它不消耗辅助空间并以线性时间运行。发布,您将运行合并排序,无论条件如何,均为nlog(n)(除非您使用自然合并排序,在这种情况下,最好的情况归结为O (n)并且运行插入排序算法更有意义,并消耗O(n)的辅助空间。

尽管如此,值得注意的是像Java这样的语言使用双枢轴快速排序算法而不是合并排序(最坏情况下快速排序是O(n ^ 2))。我对此并不完全确定,但可以归结为快速排序使用较少的辅助空间这一事实,但更重要的是,因为对于最坏的情况,阵列并不常见。