Algorithm(a-array, n-length):
for(i=2;i<=n;i++)
if(a[1]<a[i]) Swap(a,1,i);
for(i=n-1;i>=2;i--)
if(a[n]<a[i]) Swap(a,n,i);
我有兴趣确定在最坏的情况下在上面的代码中调用Swap
的次数,所以我有一些问题。
那里最糟糕的情况是什么?
Swap
将不会在第二个循环中被调用,反之亦然,即在每次迭代中都不能在两个循环中调用它。我现在该怎么办?如何将那两个彼此相反的最坏情况结合起来? 最坏的情况意味着我希望尽可能多的交换调用。 :)
P.S。我看到复杂度是O(n),但我需要尽可能精确地估计Swap执行了多少次。
编辑1:Swap(a,i,j)
交换元素a[i]
和a[j]
。
答案 0 :(得分:1)
设s和r是原始数组中最大元素和次大元素的位置。在第一个循环结束时: -
最大的将来到第一位。
如果r <那么下一个最大的位置现在将是r。如果r>它仍然是r。
在第二个循环结束时,最大元素的下一个元素将在结尾处
对于第一个循环,固定s的最坏情况是当所有元素都是按升序排列时。互换的数量是s。
对于第二个循环,如果最大的下一个更接近数组的开头,则发生最坏的情况。当r 例如A = [1 2 5 7 3 4]这里最多为elemnt 7它是递增的并且在降序之后
掉期数= 5
答案 1 :(得分:0)
第一个循环的最坏情况是每个 a i 小于 a j ,1≤ i &lt; j ≤ n 。在这种情况下,每个 a j 与 a 1 交换,以便在结束 a 1 是最大的数字。此交换最多只能发生 n -1次,例如:
[1,2,3,4,5] ⟶ [5,1,2,3,4]
同样,第二个循环的最坏情况是每个 a i 大于 a < sub> j ,其中2≤ i &lt; j ≤ n 。在这种情况下,每个 a i 与 a n 交换以便最后 a n 是子数组的最大数量 a <子> 2 子>,...,一 <子> 名词的子>。此交换最多只能发生 n -2次,例如:
[x,4,3,2,1] ⟶ [x,3,2,1,4]
现在棘手的部分是结合两个条件,因为两个循环中Swap
调用的条件是互斥的:对于任何一对 a i , a j ,其中1≤ i &lt; j ≤ n 和 a i &lt; a j ,第一个循环将调用Swap
。但是对于任何这样的对,第二个循环不会调用Swap
,因为它期望相反: a i &gt; 一 <子> Ĵ 子>
因此Swap
次调用的最大数量为 n -1。