算法冒泡排序

时间:2015-12-13 15:59:10

标签: algorithm bubble-sort

我对冒泡排序伪代码中的特定行有疑问。

enter image description here

我不明白为什么subtract。这是否意味着我们应该从最后一个元素(1和7)开始比较?

3 个答案:

答案 0 :(得分:0)

没有。比较的元素具有索引jj+1。在内循环的第一次迭代j==0上,以便比较元素59

花一些时间"跑步"手动算法。

答案 1 :(得分:0)

不,你的泡泡"排序算法始终从前面开始工作。即使外循环向后计数,变量i也从不用于引用数组索引,只有j是在内循环中定义的。相反,代码中的外部循环用于确定内循环中的计数值,表示我们需要进行多少次比较。

代码的作用如下:
假设A拥有我们的数组:[5,9,2,7,1]," n"是5,数组的长度,我们的swap函数工作,外循环运行:
for i=(n-1) to 1。这会将i设置为4.循环将运行4次。我们代码中的变量i表示要进行的比较次数 内循环运行:
for j = 0 to (i-1)这会将j设置为0.循环将运行4次 我们的if语句叫做:
if A[j] < A[j+1]因此比较索引0和1. A[0]保持5,A[1]保持9.由于5小于9,我们的if语句为真。
调用swap(A[j],A[j+1])。现在我们的数组是:[9,5,2,7,1]

我们的内循环再次运行,j = 1 我们的if语句比较索引1和2. A[1]保持5,A[2]保持2.由于5不小于9,我们的if语句为false。

我们的内循环再次运行,j = 2 我们的if语句比较索引2和3. A[2]保持2,A[3]保持7.由于2小于7,我们的if语句为真。
调用swap(A[j],A[j+1])。我们的数组现在显示为:[9,5,7,2,1]

我们的内循环再次运行,j = 3 我们的if语句比较索引3和4. A[3]保持2,A[4]保持1.我们的if语句是假的。

我们的内循环已经完成,我们现在知道我们的最后一个元素是正确。 所以我们再次运行我们的外循环。 i现在是3,因为我们的最后一个元素是正确的。

我们用j = 0运行内循环。它将运行到i,即3。

A[0]持有9而A[1]持有5,我们的if语句为false 下一个循环,j = 1 A [1]持有5,A [2]持有7.我们的if语句为真,所以我们交换它们。 我们的数组现为:[9,7,5,2,1]
我们的逻辑继续,直到我们确定我们的倒数第二个元素正确 在内循环完成后,我们再次耗尽外循环:
i现在是2,要做的比较次数 我们的内环以j = 0到1发射。
因此,我们将索引0与1和1与2进行比较。两者都是假的 我们现在确定我们的中间元素正确 i现在为1,这意味着我们进行了一次比较 我们的内循环以j = 0到0运行:
因此我们比较索引0和1,因为我们的if语句是假的,我们不会交换任何东西 我们的内循环完成 我们现在确定我们的第二个要素正确 我们的外循环完成。
我们现在确定我们的整个数组正确

我们的数组现已排序:[9,7,5,2,1]

该算法在最坏的情况下也能正常工作:
http://jsfiddle.net/mw5L8qzL/
(一个空数组,以及一个只包含一个元素的数组)

答案 2 :(得分:0)

外部循环“冒泡”范围A [0,...,i]中的最大元素到插槽A [i]。因此,在下一次迭代中,您可以忘记A [i],并将作业限制为排序A [0,...,i-1]。 很明显,当外部循环的n-1次迭代后问题大小为1时,你只剩下该范围内的一个元素,所以你就停在那里。