为什么这个冒泡排序有效?

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,然后才发生赋值本身。