在我的书中,他们计算了n的输入上插入排序的运行时间。算法是:
Insertion-Sort(A) cost times
1. for j <- 2 to length[A] c1 n
2. do key <- A[j] c2 n-1
3. Insert A[j] into the 0 n-1
sorted sequence A[1..j-1]
4. i <- j - 1 c4 n-1
5. while i > 0 and A[i] > key c5 sum_{j=2}^n t_j
6. do A[i+1] <- A[i] c6 sum_{j=2}^n (t_j-1)
7. i <- i - 1 c7 sum_{j=2}^n (t_j-1)
8. A[i+1] <- key c8 n-1
我的问题是为什么第1行的时间= n?为什么不只是n-1次?
答案 0 :(得分:1)
在我看来,实际上没有初始化的额外1次成本是因为在n-1次成功迭代控制之后将返回到i <=(长度(A))条件并且将i与A的长度进行比较。这1个额外的比较成本添加到循环中。
这个问题在第4页上有解释。科尔曼算法简介25。
答案 1 :(得分:0)
根据C中的for循环来考虑它:
for (int i = 2; i <= length(A); ++i) ...
此行已达到 n 次 - 一次用于初始化, n - 1次用于增量和测试。
答案 2 :(得分:0)
CLRS的第25页 “当for或while循环时 以通常的方式退出(即由于循环头中的测试),则执行测试 比环体多一倍。” 这意味着退出条件将在退出for或while循环之前再执行一次。