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
,所以我有一些问题。函数调用了多少次?
那里最糟糕的情况是什么?
- 如果我只有第一个for循环,可以说,对于这个算法最坏的情况是,该阵列一个已按升序排序,并交换会被称为N-1次。
- 如果我只有第二个循环,最坏的情况也会是a已经排序,但是这次订单会下降。这意味着如果我们考虑第一个最坏的情况,
Swap
将不会在第二个循环中调用,反之亦然,即在每次迭代中都不能在两个循环中调用它。
现在我该怎么办?如何将这两种相反的最差情况结合起来? 最坏的情况意味着我想尽可能多地进行交换呼叫。 :)
P.S.我发现复杂度是O(n),但我需要尽可能精确地估计Swap执行的次数。
编辑1:Swap(a,i,j)
交换元素a[i]
和a[j]
。
是对第二个for循环内循环? –
不,它不是。循环不嵌套。 – Milos
我已经对包含10个独特元素的数组的所有可能的排列组合测试了这种算法,并且在它们中的任何一个上执行的最多交换是9。从经验观察来看,n-1互换是大小为n的数组的最差情况。但我没有正式的证据,这就是为什么这是一个评论,而不是一个答案。 – Kevin