2016-11-05 10 views
0

私はこのスワップが正しく動作しない理由を理解しようとしています。私は、これは、クイックソートのパーティション方式である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に変更されましたが、pivotarray[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

Rubyコードで 'for'を見るのは非常に珍しいことです。 '(〜から〜へ).each do | i |'はもっと典型的なRubyです。 – tadman

答えて

0

ここでは、並列割り当てが何をしているのかを解説しましょう。

たちは、配列を持っていると言う:

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

これは正常な動作です - 私たちは、同時に次の2種類の操作をやっている:
arr[0] = arr[1]arr[1] = arr[0]を。

は今、私たちは今、私たちはfirst = arr[1]arr[1] = firstを行っているためです

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

を行うこととします。
firstは、arr[0]の値に設定された変数であり、この変数を変更しても配列は変更されません。

+1

smhの瞬間右そこに...笑。さて、私はまだ学習段階です! @Damonをクリアしてくれてありがとう – hockmode

+0

@hockmode np、誰もがすべてのスキルレベルでそれらの瞬間を持っています:) – Damon