Я пытаюсь понять, почему этот обмен не работает должным образом. Я добавил p
проверить значения на repl.it Это метод раздел для сортировки:Ruby Variables Swap confusion
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]
.
Видеть 'for' в Ruby-коде очень необычно. '(from ... to) .each do | i |' более типичный Ruby. – tadman