我给出了一个简单的pseoducode算法:
for j=1 to A.length-1 //first line
for i =1 to A.length-j //second line
if A[i-1] >A[i]
swap A[i-1] and A[i]
我告诉第二条线是这样的(最糟糕的情况:
n+(n-1)+...+2 = n(n+1)/2-1
据我所知,当第一行运行时,第二个循环运行n次,每次下一次迭代j,第二次循环运行1次(n-1) +(n-2)
等。
我明白这显然是一个总结,但我不知道最后添加的内容是2
(第二行)。
非常感谢任何意见。
答案 0 :(得分:3)
考虑到A.length为n,你可以清楚地验证相同。我正在为你做这件事:
for j=1 to n-1 //first line
for i =1 to n-j //second line
if A[i-1] >A[i]
swap A[i-1] and A[i]
因此,对于j = 1的外循环的第一次迭代,内循环从1到n-1次运行。 => n-1个
对于外循环的第二次迭代,内循环从1到n-2次运行。 =>的n-2
对于外循环的第i次迭代,内循环将运行1到n-i次,=> n-i。
外循环的最后一次迭代将在j = n-1时,内循环将运行i = 1到n-(n - 1)= 1次。
因此,结果将是n-1 + n-2 + ... + 1 =(n-1)* n / 2的总和。
所以,最后应该显然是1。
我明白这显然是一个总结,但这是我得不到的 这就是为什么最后添加的是2(FOR THE SECOND LINE)。
我建议你和你的朋友/教授谈谈这个问题,他显然已经错误地通知了你。这是我在这里解决的问题。
人们通常认为,当阵列的前n-1个元素已经排序时,最后一个元素已经适合确切的位置。因此,他们通常会假定这一点并离开最后一步。
但是,在计算OR算法中,我们(通常)计算它。你的这段代码就是在这里计算的。