两种冒泡排序算法的区别

时间:2012-11-29 17:06:16

标签: c# algorithm comparison bubble-sort

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

第一个例子:

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) - &gt; ( 1 5 4 2 8),从5开始的交换&gt; 1

     

(1 5 4 2 8) - &gt; (1 4 5 2 8),从5开始的交换> 4

     

(1 4 5 2 8) - &gt; (1 4 2 5 8),从5开始的交换> 2

     

(1 4 2 5 8 ) - &gt; (1 4 2 5 8

     

第二次通过:

     

1 4 2 5 8) - &gt; ( 1 4 2 5 8)

     

(1 4 2 5 8) - &gt; (1 2 4 5 8),从4开始的交换> 2 &lt; - 示例1停在此处

     

(1 2 4 5 8) - &gt; (1 2 4 5 8)

     

(1 2 4 5 8 ) - &gt; (1 2 4 5 8

     

第三次通过

     

1 2 4 5 8) - &gt; ( 1 2 4 5 8)

     

(1 2 4 5 8) - &gt; (1 2 4 5 8)

     

(1 2 4 5 8) - &gt; (1 2 4 5 8)

     

(1 2 4 5 8 ) - &gt; (1 2 4 5 8 &lt; - 示例2停在此处

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

6 个答案:

答案 0 :(得分:2)

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

具体来说,迭代'j':

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

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

上面的

for循环将具有条件j&lt; 4 - 1 - i,其中i = 1,因此j <1。 4 - 1 - 1,所以j&lt; 2 所以最后使用的j将是j = 1,最后的比较将是输入[1]&gt;输入[2] - &gt;输入[3]永远不会被比较。

您可以通过将循环更改为j&lt; = input.Length - 1 - i来修复它

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

两者都是对的。

第一个效率相对较高。

答案 3 :(得分:1)

没有做太多思考,看起来它们都是正确的,但第一个似乎做了更少的冗余操作,因此执行的时间更少

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

答案 4 :(得分:1)

在冒泡排序中,在第一次传递之后,保证最大值将占据数组中的最后一个位置。这是因为根据定义,冒泡排序会将最高值交换到数组的末尾。

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

通过扩展,在i通过后,i个顶部元素将处于正确的位置。

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

这有意义吗?

答案 5 :(得分:1)

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

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

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