web-dev-qa-db-ja.com

中央の要素をピボットとして使用したクイックソート

クイックソートについての私の理解は

  1. ピボット要素を選択します(この場合、ピボットとして中央の要素を選択しています)
  2. 極端な場合は、左右のポインタを初期化します。
  3. ピボットよりも大きい、ピボットの左側にある最初の要素を見つけます。
  4. 同様に、ピボットよりも小さいピボットの右側にある最初の要素を見つけます
  5. 3と4で見つかった要素を交換します。
  6. 左> =右でない限り、3,4,5を繰り返します。
  7. ピボットがその場所に配置されたので、左右のサブアレイに対してすべてを繰り返します。

私はここで何かが欠けていて、非常に愚かであると確信しています。しかし、上記はこのアレイでは機能していないようです。

  8,7,1,2,6,9,10,2,11 pivot: 6  left pointer at 8, right pointer at 11
  2,7,1,2,6,9,10,8,11 swapped 2,8  left pointer at 7, right pointer at 10

それで ?右側に6より小さい要素はありません。 7は6の右側にどのように移動しますか?

6
Walt

あなたの混乱は、パーティションが2つを分離するランドマークであるべきだと思うからです。これは正しくありません(中間要素ピボットの場合)。

  • Lomutoのパーティション(ピボット=最も右側のパーティション)。左:(lo ... p-1)(ピボットは含まれていないことに注意してください)右:(p + 1 ...高)
  • ピボットとしての中央の要素。セグメントは分割されています:左:(lo ... p)右:(p + 1 ...高)[ https://en.wikipedia.org/wiki/Quicksort]
0
user2616989