我试图弄清楚为什么这个交换不能正常工作。我添加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]
。
答案 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]
处的值的变量,更改此变量不会改变数组。