为什么这个冒泡排序有效?
Why does this bubblesort work?
我找到了这个冒泡排序代码 here 并想知道它为什么有效。
function bubbleSort(A)
local itemCount=#A
local hasChanged
repeat
hasChanged = false
itemCount=itemCount - 1
for i = 1, itemCount do
if A[i] > A[i + 1] then
A[i], A[i + 1] = A[i + 1], A[i]
hasChanged = true
end
end
until hasChanged == false
end
我假设如下:
A[i], A[i + 1] = A[i + 1], A[i]
等同于:
A[i] = A[i + 1]
A[i + 1] = A[i]
这会导致
A[i] = A[i + 1]
例子
A = { [1] = 3, [2] = 1 }
将在
结束
A = { [1] = 1 , [2] = 1 }
为什么没有?
显然,正如您自己指出的那样,您的假设是错误的:
Lua 允许实际交换变量而无需中间临时分配,就像您发现的冒泡排序一样。
因此
A[i], A[i + 1] = A[i + 1], A[i]
确实有效。
编辑:很难给你一个你还没有在这里给过自己的答案...
如您所知,您的假设是错误的。您可能知道,在 lua 中,一个表达式允许 return 多个值。反过来,您也可以将表达式的结果分配给多个变量。在您的代码段中:
A[i], A[i + 1] = A[i + 1], A[i]
A[i+1], A[i]
的结果是evaluated 在任何值实际改变之前,意味着当赋值发生时,值A[i+1], A[i]
中的那些被分配给 A[i], A[i+1]
,正如预期的那样。
简而言之:首先,右侧的表达式被 evaluated,然后才发生赋值本身。
我找到了这个冒泡排序代码 here 并想知道它为什么有效。
function bubbleSort(A)
local itemCount=#A
local hasChanged
repeat
hasChanged = false
itemCount=itemCount - 1
for i = 1, itemCount do
if A[i] > A[i + 1] then
A[i], A[i + 1] = A[i + 1], A[i]
hasChanged = true
end
end
until hasChanged == false
end
我假设如下:
A[i], A[i + 1] = A[i + 1], A[i]
等同于:
A[i] = A[i + 1]
A[i + 1] = A[i]
这会导致
A[i] = A[i + 1]
例子
A = { [1] = 3, [2] = 1 }
将在
结束A = { [1] = 1 , [2] = 1 }
为什么没有?
显然,正如您自己指出的那样,您的假设是错误的:
Lua 允许实际交换变量而无需中间临时分配,就像您发现的冒泡排序一样。
因此
A[i], A[i + 1] = A[i + 1], A[i]
确实有效。
编辑:很难给你一个你还没有在这里给过自己的答案...
如您所知,您的假设是错误的。您可能知道,在 lua 中,一个表达式允许 return 多个值。反过来,您也可以将表达式的结果分配给多个变量。在您的代码段中:
A[i], A[i + 1] = A[i + 1], A[i]
A[i+1], A[i]
的结果是evaluated 在任何值实际改变之前,意味着当赋值发生时,值A[i+1], A[i]
中的那些被分配给 A[i], A[i+1]
,正如预期的那样。
简而言之:首先,右侧的表达式被 evaluated,然后才发生赋值本身。