我对冒泡排序伪代码中的特定行有疑问。
我不明白为什么subtract
。这是否意味着我们应该从最后一个元素(1和7)开始比较?
答案 0 :(得分:0)
没有。比较的元素具有索引j
和j+1
。在内循环的第一次迭代j==0
上,以便比较元素5
和9
。
花一些时间"跑步"手动算法。
答案 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时,你只剩下该范围内的一个元素,所以你就停在那里。