【问题标题】:Difference between two bubble sort algorithms两种冒泡排序算法的区别
【发布时间】:2012-11-17 19:59:00
【问题描述】:

我找到了两个冒泡算法,但我不确定哪个是正确的......

第一个例子:

for (int i = 1; i < input.Length-1; i++)
    for (int j = 0; j < input.Length - 1 - i; j++)
        if (input[j] > input[j + 1])
            swap(input, j, j + 1);

第二个例子:

for (int i = 1; i < input.Length-1; i++)
    for (int j = 0; j < input.Length - 1; j++)
        if (input[j] > input[j + 1])
            swap(input, j, j + 1);

Wikipedia Example

对于输入:5 1 4 2 8

第一个例子:6 次比较

第二个例子:12 个比较

第一关:

( 5 1 4 2 8 ) --> ( 1 5 4 2 8 ), Swap since 5 > 1

( 1 5 4 2 8 ) --> ( 1 4 5 2 8 ), Swap since 5 > 4

( 1 4 5 2 8 ) --> ( 1 4 2 5 8 ), Swap since 5 > 2

( 1 4 2 5 8 ) --> ( 1 4 2 5 8 )

第二关:

( 1 4 2 5 8 ) --> ( 1 4 2 5 8 )

( 1 4 2 5 8 ) --> ( 1 2 4 5 8 ), Swap since 4 > 2

( 1 2 4 5 8 ) --> ( 1 2 4 5 8 )

( 1 2 4 5 8 ) --> ( 1 2 4 5 8 )

第三遍

( 1 2 4 5 8 ) --> ( 1 2 4 5 8 )

( 1 2 4 5 8 ) --> ( 1 2 4 5 8 )

( 1 2 4 5 8 ) --> ( 1 2 4 5 8 )

( 1 2 4 5 8 ) --> ( 1 2 4 5 8 )

编辑:当我说哪个是正确的时,我的意思是哪个是原始冒泡排序

【问题讨论】:

  • 两个例子都不正确
  • @EgorSkriptunoff 哈哈,伙计,他们不是不正确的……他们来自书……维基百科也使用了 2 个循环
  • 是的,两者都是正确的。第一个是优化的。当你下线时,你不需要检查整个数组,因为它的故事已经排序了。
  • @Loclip - 不要相信书籍。用你的大脑代替。第一个示例从不触及数组的最后一个元素,因此在排序 {1,3,2} 时失败。第二个示例执行了太多冗余操作而无法“正确”。

标签: c# algorithm comparison bubble-sort


【解决方案1】:

第一个算法不正确。 如果数组中的最后一个元素不是最大的,它将失败。

具体来说,在 'j' 上迭代:

for (int j = 0; j < input.Length - 1 - i; j++)

似乎跳过了最后一个元素。 如果您的输入是 {0, 2, 2, 1} 然后你的 input.Length = 4

上面的for循环将有条件j input[2] -> input[3] 永远不会比较。

您可以通过将 for 循环更改为 j 来修复它

【讨论】:

    【解决方案2】:

    我找到了两个冒泡算法,但我不确定哪个是正确的..

    我相信他们都是对的。唯一的区别是您的第二个代码必须最后一次遍历已排序的数组。

    【讨论】:

      【解决方案3】:

      两个都是对的。

      第一个比较高效。

      【讨论】:

      • 不是先坏了吗?它不比较数组中的最后一个元素。
      【解决方案4】:

      不用想太多,看起来都对,但第一个似乎做的冗余操作较少,因此执行时间较短

      第一个似乎取决于你最后一个 i 块是正确的事实,因此它甚至不会打扰它们。

      【讨论】:

        【解决方案5】:

        在冒泡排序中,第一次通过后,您可以保证最大值将占据数组中的最后一个位置。这是因为根据定义,冒泡排序将最大值交换到数组的末尾。

        这意味着在第二遍时,不需要再次比较最后一个值,因为它保证大于或等于下一个较低索引中的元素。同样,在第 2 步之后,前两个元素将是最高值并相对于彼此排序。

        通过扩展,i 传递后,i 顶部元素将处于正确位置。

        第一个示例考虑了这一点,通过从最大 j 迭代器值中减去 i。第二个示例不必要地比较后续遍历中的上部元素。它没有坏处,但它是多余的,即没有优化。它仍然是冒泡排序,因为它交换相邻的值,将较高值的元素移向数组的末尾。

        这有意义吗?

        【讨论】:

          【解决方案6】:

          第一个就是所谓的优化冒泡排序

          http://en.wikipedia.org/wiki/Bubble_sort#Optimizing_bubble_sort

          第二种是“经典”冒泡排序。

          【讨论】:

            猜你喜欢
            • 2016-03-19
            • 1970-01-01
            • 2013-09-04
            • 2013-11-02
            • 2016-11-01
            • 2015-01-17
            • 2013-03-08
            • 2021-03-24
            • 2018-02-08
            相关资源
            最近更新 更多