改进冒泡排序的运行时间分析

时间:2012-09-21 00:00:33

标签: algorithm analysis bubble-sort

我正在完成一项家庭作业,我需要在大小 n 的数据集中找到修改后的冒泡排序所做的比较次数。要考虑的数据集是一个排序列表,其中第一个和最后一个元素被交换,例如:52341。下面是算法的伪代码:

i <- n-1; new_i <- i
while i > 0 do 
    for j=1 to i do
        if A[j] > A[j+1] do
            A[j] <=> A[j+1]
            new_i <- j
        endif
    endfor
    i <- new_i - 1; new_i <- i
endwhile

A是数据集,&lt; =&gt;是交换。

我试图找到一种方法来表示这种算法的总结,将其简化为给定数据集类型的比较量的表达式。

如果没有给出答案,任何人都能把我推向正确的方向吗?

1 个答案:

答案 0 :(得分:2)

在Bubblesort实现中,比较次数完全取决于输入的大小,即输入列表中元素的顺序无关紧要。

如果你能证明这一点(这不是很难),那么计算一个大小为N的输入列表的比较次数就足够了。因为我们已经证明顺序无关紧要,这又相当容易:

我们有两个循环,外部while循环和内部for循环。外部循环从n到1(或n-1到0,但肯定不是从n-1到1,如代码所示),即我们有N次迭代。内循环从1到i。

因此,我们在外环的第一次迭代中进行N次比较,第二次在第二次迭代中进行N次比较,在第三次中进行N-2,在N-N'中进行0次。

我认为你是独自来到这里的。否则,无论如何你都被搞砸了。

您的老师现在想要看到的是您知道以下公式,即所谓的“GaußscheSummenformel”,也称为“高斯和”:

N +(N-1)+(N-2)+ ... +(N-N + 1)+(N-N)= N ^ 2/2 + N / 2

所以你在这里应该做的是:

  • 显示比较次数取决于输入的大小
  • 表示比较次数等于N +(N-1)+(N-2)+ ... +(N-N + 1)+(N-N)
  • 提到这与N ^ 2/2 + N / 2相同,指的是高斯先生。

- )

相关问题