改进冒泡排序的运行时间分析
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ß。;-)
【讨论】:
以上是关于改进冒泡排序的运行时间分析的主要内容,如果未能解决你的问题,请参考以下文章