我对冒泡排序伪代码中的特定行有疑问。
此伪代码取自wikipedia:
procedure bubbleSort( A : list of sortable items )
n = length(A)
repeat
swapped = false
for i = 1 to n-1 inclusive do //THIS IS THE LINE I DON'T UNDERSTAND
/* if this pair is out of order */
if A[i-1] > A[i] then
/* swap them and remember something changed */
swap( A[i-1], A[i] )
swapped = true
end if
end for
until not swapped
end procedure
我不理解for循环的条件(1到n-1)。我显然必须遍历从索引1处的第二个元素到算法运行的最后一个元素的所有元素。
但是当我读到n-1这个词时,我认为它是最后一个减去1的元素,它会跳过最后一个元素。所以我想我的问题是,在这种情况下,n-1究竟意味着什么?
答案 0 :(得分:2)
如果n
是元素的数量。最高指数为n-1
。
此行从索引1
迭代到最高索引n-1
。
第一个元素的索引为0
。这段代码不会从那里开始,因为它在循环中做了什么。注意i-1
部分。
为您举例说明伪代码的作用:
`A ={'C', 'E', 'B', 'D', 'A'}`
`n` = `5`
inner_loop for i => 1, 2, 3, 4
i = 1
if(A[0] > A[1]) => false
i = 2
if(A[1] > A[2]) => true
swap(A[1] , A[2]) => A ={'C', 'B', 'E', 'D', 'A'}
swapped = true
i = 3
if(A[2] > A[3]) => false
i = 4
if(A[3] > A[4]) => true
swap(A[3] , A[4]) => A ={'C', 'B', 'E', 'A', 'D'}
swapped = true
从某种意义上说,这段代码并不是通过元素运行,而是通过相邻元素的比较。
答案 1 :(得分:0)
n-1
并不意味着倒数第二个元素。它意味着最后一个元素。
这就是原因:通常在编程中,列表是零索引,这意味着编号从零开始并转到n-1
,其中n
是长度的清单。循环从i = 1
开始,实际上是第二个元素(因为以后你必须将A[i]
与A[i-1]
进行比较 - 这是第一个元素)
答案 2 :(得分:0)
由于大多数编程语言都以索引0开头,因此对于大小为n的数组,您只想从数组索引0到数组索引n-1进行比较。如果你继续n,你将在行中的数组之外进行比较:
if A[i-1] > A[i]
希望这有帮助。
答案 3 :(得分:0)
这是用伪代码编写的,所以我们不确定“语言”如何实现数组索引,但似乎它是0索引的。这意味着如果长度(A)= n = 5,则元素从0到4编号(即A [0]是如何访问第一个元素A [4]是如何访问最后一个元素。)
答案 4 :(得分:0)
排序一直持续到n-1,因为最后一个元素将在最后一次迭代期间自动排序,即在bubblesort的情况下进行第n次迭代