私はこのスワップが正しく動作しない理由を理解しようとしています。私は、これは、クイックソートのパーティション方式であるrepl.it上の値をチェックするp
を追加しました:ルビー変数スワップ混乱
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]
に変更されます。
Rubyコードで 'for'を見るのは非常に珍しいことです。 '(〜から〜へ).each do | i |'はもっと典型的なRubyです。 – tadman