我正在修改考试。
想知道在什么条件下,在O(N ^ 2)的相同平均情况复杂度下,插入排序的性能优于冒泡排序。
我确实找到了一些相关的文章,但我无法理解它们。
有人会介意以简单的方式解释它吗?
答案 0 :(得分:5)
bubblesort的优点在于检测已经排序的列表的速度:
BubbleSort最佳案例场景: O(n)
然而,即使在这种情况下,插入排序也会变得更好/相同。
Bubblesort或多或少只对理解和/或教授sortalgorithm的机制有好处,但是近来在编程中找不到合适的用法,因为它的复杂性
<强> O(N²)强>
意味着它的效率在超过少量元素的列表中显着降低。
答案 1 :(得分:3)
我想到了以下事情:
冒泡排序总是再次传递数组以确定它是否已排序。另一方面,插入排序不需要这个 - 一旦插入最后一个元素,算法保证数组被排序。
冒泡排序会在每次传递时进行n
次比较。插入排序的次数少于n
:一旦算法找到插入当前元素的位置,它就会停止进行比较并获取下一个元素。
最后,请引用wikipedia文章:
冒泡排序也与现代CPU硬件交互不良。它 需要至少两倍于插入排序的写入次数,两倍 许多缓存未命中,渐近更多分支错误预测。 Astrachan在Java中对字符串进行的实验显示了冒泡排序 大约比插入排序慢5倍,慢40% 选择排序
您可以在那里找到原始研究论文的链接。
答案 2 :(得分:0)
我想你要找的答案是here:
冒泡排序也可以在已经列出的列表上有效使用 排序除了极少数元素。例如,如果 只有一个元素不按顺序排列,冒泡排序只需2n时间。 如果两个元素不按顺序排列,则冒泡排序最多只能进行 3n时间......
和
插入排序是一种相对简单的排序算法 对于小型列表和大多数已排序的列表有效,并且经常使用 作为更复杂的算法的一部分
答案 3 :(得分:0)
您能提供您不理解的相关文章的链接吗?我不确定他们可能会解决哪些方面。除此之外,理论上的差异可能是冒泡排序更适合表示为数组的集合(而不是表示为链表的集合),而插入排序适用于链表。
理由是冒泡排序总是一次交换两个项目,这对于数组和链表都是微不足道的(在数组上更有效),而插入排序在给定列表中的某个位置插入,这对于链接来说是微不足道的列表但涉及将数组中的所有后续元素移动到右侧。
话虽如此,带上一粒盐。首先,实际上,排序数组几乎总是比排序链表更快。仅仅因为扫描列表一次已经存在巨大差异。除此之外,将数组的n个元素向右移动比执行n(或甚至n / 2)交换要快得多。这就是为什么其他答案正确地声称插入排序在一般情况下是优越的,以及为什么我真的想知道你阅读的文章,因为我没有想到一个简单的方式说这在案例A中更好,并且在案例中更好乙
答案 4 :(得分:0)
在最坏的情况下,两者都倾向于在O(n ^ 2)
执行在最好的情况下,即当数组已经排序时,冒泡排序可以在O(n)处执行。