我们在课堂上学习插入排序是omega线性运行时间(如果传递已经排序的数组)和Big-O O(n ^ 2)用于所有其他情况。然后,我们的教授开始关于插入排序的理想,其中包含"合并排序"方法,理想的是使用合并排序并具有O(nlogn)运行时间?他根本不是一个非常清楚的人。你能解释一下他的意思吗?
答案 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))。我对此并不完全确定,但可以归结为快速排序使用较少的辅助空间这一事实,但更重要的是,因为对于最坏的情况,阵列并不常见。