【问题标题】:Why does this bubblesort work?为什么这个冒泡排序有效?
【发布时间】:2015-02-16 11:19:39
【问题描述】:

我发现了这个冒泡排序代码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 }

为什么没有?

【问题讨论】:

标签: sorting lua lua-table bubble-sort


【解决方案1】:

如您所知,您的假设是错误的。您可能知道,在 lua 中,允许一个表达式返回多个值。反过来,您也可以将表达式的结果分配给多个变量。在你的 sn-p 中:

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]

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

【讨论】:

    【解决方案2】:

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

    Lua 允许在没有中间临时分配的情况下实际交换变量,就像您发现的冒泡排序一样。

    因此

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

    确实有效。

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

    【讨论】:

    • 嗯不是我期望的那种答案,基本上你是在告诉我“它有效,因为它有效。”
    猜你喜欢
    • 2020-09-11
    • 2015-09-12
    • 1970-01-01
    • 2016-03-07
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多