Ruby变量交换混乱

时间:2016-11-05 00:10:33

标签: ruby swap

我试图弄清楚为什么这个交换不能正常工作。我添加p来检查repl.it上的值。这是快速排序的分区方法:

def partition (array, from, to)
    #declared pivot to last index of array
    pivot = array[to]
    pIndex = from
    for i in from..to-1
        if array[i] <= pivot
            array[i], array[pIndex] = array[pIndex], array[i]
            pIndex += 1
        end
    end
    p pivot
    p array[to]
    ### why doesn't this work properly?  pivot is same as array[to]
    ### array[pIndex], pivot = pivot, array[pIndex]
    ### the swap below works
    array[pIndex], array[to] = array[to], array[pIndex]
    p array
    return pIndex
end

我有pivot = array[to]。然后将其与数组[pIndex]交换:array[pIndex], pivot = pivot, array[pIndex]array[pIndex]值更改为pivot,但pivot未更改为array[pIndex]。但是当我这样做时:array[pIndex], array[to] = array[to], array[pIndex]它完美地找到了。谁能告诉我为什么?

数组示例:

arr = [7, 2, 1, 6, 8, 5, 3, 4]

partition(arr, 0,7)

在最后一次交换之前,数组是[2, 1, 3, 6, 8, 5, 7, 4]。我的最后一行交换假设交换pivot为4,array[pIndex]为6.这应该将数组更改为[2, 1, 3, 4, 8, 5, 7, 6]

1 个答案:

答案 0 :(得分:0)

让我们分解并行分配在这里做的事情。

假设我们有一个数组:

arr = [1, 2]
arr[0], arr[1] = arr[1], arr[0]
# arr => [2, 1]

这是预期的行为 - 我们同时进行以下两项操作:
arr[0] = arr[1]arr[1] = arr[0]

现在假设我们

arr = [1, 2]
first = arr[0]
first, arr[1] = arr[1], first
# arr => [1, 1]
# first => 2

这是因为现在我们正在进行first = arr[1]arr[1] = first first是设置为arr[0]处的值的变量,更改此变量不会改变数组。