使用插入排序对10 ^ 7条记录进行排序所花费的时间

时间:2014-11-09 05:10:08

标签: algorithm time-complexity insertion-sort

我对即将进行的测试的修改感到困惑。

问题是:

  

插入排序的实现花费1秒来对10 ^ 6条记录的列表进行排序。它将花费多少秒来对10 ^ 7条记录进行排序?

使用

T(X)/T(1) = 10^7/10^6 

我认为答案是10秒,但实际答案是100秒。

有人可以帮帮我吗?

4 个答案:

答案 0 :(得分:4)

如果插入排序是在线性(即O(n))时间内运行的操作,那么您的答案是正确的。但事实并非如此。

插入排序的平均情况复杂度为O(n^2)(即它的二次方)。松散地说,这意味着它平均需要4倍的时间来排序2倍的记录; 9倍的排序次数是3倍; 16倍的排序次数是4倍;等等。

问题是你需要多长时间才能对10倍的记录进行排序;什么10平方时间1秒?

答案 1 :(得分:1)

查看insertion sort的性能,它被定义为О(n ^ 2) - 这意味着当n增加10倍时,它所花费的时间将增加n ^ 2(100)

答案 2 :(得分:1)

我们知道Insertion Sort是一个O(n ^ 2)算法,我们假设T(n)是它的时间复杂度。 所以 T(n)= c n ^ 2 对于某些常数c> 0 我们得到T(10 ^ 6)= 1。所以 c (10 ^ 6)(10 ^ 6)= 1 。我们得到c的值为10 ^ -12。在 T(10 ^ 7)= c (10 ^ 7)(10 ^ 7)中插入此c值 暗示 T(10 ^ 7)=(10 ^ -12) (10 ^ 14)= 100

答案 3 :(得分:0)

考虑到插入排序需要1秒钟才能对100万个数字的特定列表进行排序。

平均而言,插入排序大约进行n(n-1)/ 4次比较和内存交换。对于n = 1e6,那么这是2.5e11,即使实现的每个循环都可以在1个周期内执行(这显然是不合理的),CPU必须以250GHz运行,这比任何真正的CPU都快。

所以一定是原始输入列表已经大部分已经排序,并且没有关于第二个列表上的运行时的结论。