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

Posted

技术标签:

【中文标题】改进冒泡排序的运行时间分析【英文标题】:Running Time Analysis of Modified Bubble Sort 【发布时间】:2012-09-21 00:00:32 【问题描述】:

我正在做一项家庭作业,要求我找出修改后的冒泡排序对大小为 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 是数据集, 是交换。

我正在尝试找到一种方法来表示该算法,并将求和简化为对给定类型数据集的比较量的表达式。

如果不给出答案,谁能把我推向正确的方向?

【问题讨论】:

拿一张纸,根据你提供的数据一步一步地“执行”那个算法,这真的很有帮助。 【参考方案1】:

在您的冒泡排序实现中,比较次数完全由输入的大小单独决定,即输入列表中元素的顺序无关紧要。

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

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

因此,我们在外循环的第一次迭代中有 N 次比较,第二次中有 N-1 次,第三次中有 N-2 次,...,第 N-N 次中有 0 次。

我想你是一个人走了这么远。不然你就完蛋了。

您的老师现在想看到的是您知道以下公式,即所谓的“Gaußsche Summenformel”,也称为“Gauss Sum”:

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一样,指的是Mr. Gauß。

;-)

【讨论】:

以上是关于改进冒泡排序的运行时间分析的主要内容,如果未能解决你的问题,请参考以下文章

冒泡排序的改进:鸡尾酒排序

冒泡排序与快速排序

冒泡排序与快速排序

冒泡排序改进版(java)

交换排序 —— 冒泡排序 + 改进

Java冒泡排序