【问题标题】:Analyzing Simple Bubble Sort Loop (Worst Case)分析简单冒泡排序循环(最坏情况)
【发布时间】:2015-10-29 16:09:54
【问题描述】:

我得到了一个简单的伪代码算法:

for j=1 to A.length-1 //first line 
  for i =1 to A.length-j //second line 
    if A[i-1] >A[i]
      swap A[i-1] and A[i]

有人告诉我第二行是这样运行的(最坏的情况:

n+(n-1)+...+2 = n(n+1)/2-1

我知道当第一行运行时,第二个循环运行 n 次,每次 j 的下一次迭代,第二个循环运行 1 次 (n-1) +(n-2) 等等。 我知道这显然是一个总结,但我不明白为什么最后添加的是2(第二行)。

任何意见将不胜感激。

【问题讨论】:

    标签: algorithm sorting big-o time-complexity complexity-theory


    【解决方案1】:

    考虑到 A.length 为 n,您可以清楚地验证相同的内容。我正在为你做:

    for j=1 to n-1 //first line 
      for i =1 to n-j //second line 
        if A[i-1] >A[i]
         swap A[i-1] and A[i]
    

    因此,对于 j = 1 处的外循环的第一次迭代,内循环从 1 次运行到 n-1 次。 => n-1

    对于外循环的第二次迭代,内循环运行 1 到 n-2 次。 => n-2

    对于外循环的第 i 次迭代,内循环将运行 1 到 n-i 次,=> n-i。

    外循环的最后一次迭代将在 j = n-1 时,内循环将运行 i = 1 到 n-(n - 1) = 1 次。

    因此,结果将是 n-1 + n-2 + ... + 1 = (n-1)*n/2 的总和。

    所以,最后应该是1。

    我明白这显然是一个总结,但我没​​有得到什么 这就是为什么最后添加的是 2(第二行)。

    我建议你与你的朋友/教授讨论这个问题,他显然错误地通知了你。这是我在这里解决的问题。

    人们通常认为,当数组的前 n-1 个元素已排序后,最后一个元素就已经适合确切的位置了。因此,他们通常会假设这一点并离开最后一步。

    但是,在计算 OR 算法中,我们(通常)计算这个。你的这段代码在这里计算。

    【讨论】:

    • 一行运行和执行的次数有区别吗?我在课堂上了解到第一行运行/执行 n 次,而不是 n-1。但是在另一堂课上,我反过来学了。我什至不知道了。
    • 阅读我的评论,这是我教授的实际解决方案,而不是朋友。我们就是这样学习的。
    • 当从1,2,3,...,n开始计数时,实际运行n+1次,即考虑循环测试语句的运行,结果加1即使是假的。但是,人们一般只关心内体的成功执行,而不关心测试语句。你应该坚持这一行,因为甚至 CLRS 后来也提到了这一行。但是,如果更具体一点,您应该在需要精确计算的所有情况下添加 +1。仅用于最坏情况分析是可以的。
    • 我希望这在课堂上能得到澄清,谢谢。
    • @user3739406 - 欢迎您在这里提出任何疑问。
    猜你喜欢
    • 2013-02-21
    • 2014-06-05
    • 2013-01-23
    • 1970-01-01
    • 1970-01-01
    • 2018-02-08
    • 2015-06-22
    • 2021-01-29
    相关资源
    最近更新 更多