为什么插入排序O(n ^ 2)?

时间:2015-01-23 14:28:58

标签: algorithm sorting

如果我给插入排序一个反向排序的数字列表,这就是我遵循它的过程:

[6,5,4,3,2,1]

[5,6,4,3,3,2] - 1 compare + 1 swap

[4,5,6,3,2,1] - 2 compares + 2 swaps

[3,4,5,6,2,1] - 3 compares + 3 swaps

[2,3,4,5,6,1] - 4 compares + 4 swaps

[1,2,3,4,5,6] - 5 compares + 5 swaps.

总共你做了15次比较和15次交换或者30次或两次,如果N是6,那么这个算法最坏情况n ^ 2除非我看错了吗?

4 个答案:

答案 0 :(得分:1)

你称之为交换的实际上并不是交换。交换涉及交换两个元素并使列表的其余部分保持不变。它可以在O(1)时间内完成。

你有一个删除后跟一个插入。此操作的复杂性为O(n),因为它会移动列表的一部分。执行这些操作的nO(n^2)

(你对比较的定义也不完全清楚,但我现在就把它留下来。)

答案 1 :(得分:1)

O(N 2 )并不意味着结果将大于N 2 ,只是它将与N 2 <成比例增长< / SUP>

这里允许任何常数因素。例如,时间可以是

的形式

T = c * N 2 + d

其中c和d是与N无关的常量。常量d是&#34;设置时间&#34;的代理,而c是每项操作的代理。其他&#34;介于&#34;之间形式也是可能的 - 你可以有线性或任何其他子方形组件,只要它们都不是“#34”支配&#34; N 2

N 2 计时背后的想法是,当您将输入的大小加倍时,时间大约增加四倍。较大的d值会掩盖这种影响,但随着N的增长,差异会减小。

答案 2 :(得分:0)

O(n^2)是您的比较的复杂性,并不意味着您(n^2)比较其复杂性等式的最大程度。在最坏的情况下,您将获得等于(n*(n-1))/2的1 + 2 + ... + n-1比较,因此其1/2(n^2) - n/2

enter image description here

答案 3 :(得分:0)

O(n ^ 2)只是最大可能'移动'的上限,移动是比较和/或交换的混合。与任何其他类型一样,O(n ^ 2)用于“普通香草插入排序”。可以有插入排序的变体,它可以使它说O(n.log n),但这些是变体,而不是插入排序,正如我们所知道/教它。

相关问题