Algorithm 气泡排序算法

Algorithm 气泡排序算法,algorithm,bubble-sort,Algorithm,Bubble Sort,我有一个关于冒泡排序伪代码中特定行的问题 我不明白为什么I=(n-1)。这是否意味着我们应该从最后一个元素(1和7)开始比较?否。被比较的元素有索引j和j+1。在内部循环的第一次迭代中,j==0,以便比较元素5和9 花一些时间手动“运行”算法。不,您的“气泡”排序算法总是从前面开始工作。即使外部循环向后计数,变量i也不会用于引用数组索引,只有j是在内部循环中定义的。相反,代码中的外部循环用于确定内部循环中的计数高度,表示需要执行多少比较 代码是这样工作的: 假设A保存我们的数组:[5,9,2

我有一个关于冒泡排序伪代码中特定行的问题


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

否。被比较的元素有索引
j
j+1
。在内部循环的第一次迭代中,
j==0
,以便比较元素
5
9

花一些时间手动“运行”算法。

不,您的“气泡”排序算法总是从前面开始工作。即使外部循环向后计数,变量
i
也不会用于引用数组索引,只有
j
是在内部循环中定义的。相反,代码中的外部循环用于确定内部循环中的计数高度,表示需要执行多少比较


代码是这样工作的:
假设
A
保存我们的数组:
[5,9,2,7,1]
,“n”是5,数组的长度,并且我们的
swap
函数工作,则运行外部循环:
对于i=(n-1)到1
。这将
i
设置为4。循环将运行4次。代码中的变量
i
表示要进行的比较次数。
运行内部循环:
对于j=0到(i-1)
这将
j
设置为0。循环将运行4次。
我们的if语句被称为:
如果A[j]
则比较指数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语句是错误的

我们的内部循环再次运行,j=2。
我们的if语句比较了指数2和指数3<代码>A[2]保存2,而
A[3]
保存7。由于2小于7,我们的if语句为true。
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。
[1]持有5,而[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语句为false,所以我们不交换任何内容。
我们的内部循环完成。
我们现在确定第二个元素是正确的 我们的外循环完成。
我们现在确定整个阵列是正确的


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

该算法也适用于最坏情况:

(一个空数组,一个只包含一个元素的数组)

外部循环将A[0,…,i]范围内的最大元素“冒泡”到插槽A[i]。因此,在下一次迭代中,您可以忽略[i],并将作业限制为对[0,…,i-1]进行排序。
显然,当外部循环的n-1次迭代后问题大小为1时,范围内只剩下一个元素,因此就到此为止。

这看起来太明显了吗?这就是你问的原因吗?因为我会说是的,这正是它的意思:从数组的末尾开始,一直到数组的开头。但它永远不会触及i=0。