我找到了两个泡泡算法,但我不确定哪一个是正确的......
第一个例子:
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);
输入: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停在此处
编辑:当我说哪一个是正确的时,我指的是哪一个是原始的冒泡排序
答案 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)