为什么这个bubort工作?

时间:2015-02-16 11:19:39

标签: sorting lua lua-table bubble-sort

我发现了这个bubblesort代码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 }

为什么不呢?

2 个答案:

答案 0 :(得分:3)

显然,正如你自己指出的那样,你的假设是错误的:

Lua允许实际交换变量而无需中间临时分配,就像您发现的气泡一样。

因此

    A[i], A[i + 1] = A[i + 1], A[i]

实际上有效。

编辑:很难给你一个你自己没有给自己答案的答案......

答案 1 :(得分:3)

如你所知,你认为错了。您可能知道,在lua中,允许表达式返回多个值。反过来,您也可以将表达式的结果分配给多个变量。在您的代码段中:

A[i], A[i + 1] = A[i + 1], A[i]

A[i+1], A[i]的结果在任何值实际更改之前评估,这意味着当分配发生时,A[i+1], A[i]中的值被分配给A[i], A[i+1]就像预期一样。

简而言之:首先,评估右侧的表达式,然后才发生赋值本身。