グラフィック2種類のクイックソートパーティション
パーティションポイントを見つけたら、左側のパーティションポイントよりも小さい値、右側のパーティションポイントよりも大きい値を入力します。
重要な点は、このパーティションポイントを配置する場所を見つける方法です。
分割方法1
パーティションポイントとして右端の3を選択します。privot は左側にprivotより小さいデータを配置し、 同じロジックに従って左側の間隔でデータ を処理 し、右側にprivotより大きいデータを配置して右側のデータを処理します。同じ論理に従った間隔
iの位置にprivotを配置したいとします
- 次に、2つの間隔が必要です。最終的な効果が得られます。
- [p、i-1] privotよりも小さい要素を配置します
- [i + 1、r] privotで拡大された要素
- ピボットを入れます
arr [i]はprivotより大きい最初の数値であり、iの後は、すべてprivotより大きいです。 トラバーサルプロセス中にprivotより小さい数値が見つかった場合、 この数値をarr [i]と交換する必要があり、i ++は保証できます。 arr [i]はprivotよりも大きい最初の位置です。 [p、r-1]を走査し、分割点arr [r]よりも小さい位置を[p、r-1]に配置し、 最後に分割点を分割点に移動します。インデックスi、およびリターンi
以下は、1つのパーティションのプロセス図です。
コードは以下のように表示されます
int partition(int arr []、int p、int r){ int privot = arr [r]; //分区点inti 、j; // arr [p、i-1]是已的理区区間 i = p、j = p; for(; j <r-1; j ++){ if(arr [j] <privot){ int tmp = arr [i]; arr [i] = arr [j]; arr [j] = tmp; i ++; } } arr [r] = arr [i]; arr [i] = privot; iを返します。 }
分割方法2
両端のポインタ
掘られたものの1つ、分割点として、この端には、 他の検査要素の端から始まる穴があります。別の要素に移動された要素よりも大きい分割点 は、このピットの端ではなく、端にピットを掘ります真ん中に移動して、この端の要素とプリボットを見てください...詳細については、下の図を見てください。 要するに、 1。穴を掘る 2.反対側の端を調べる(プリボットと比較して) 結果比較の例は 1です。中央に移動し てprivotとの比較を続けます 2.掘り出し、埋めます反対側のピットに移動し、反対側の端を中央に移動し、移動を調査するか、掘り出します
この方法でコードを分割します
関数partition1(&$ arr、$ left、$ right){ $ privot = $ arr [$ right]; while($ left <$ right){ while($ arr [$ left] <$ privot && $ left <$ right){ $ left ++; } if($ arr [$ left]> $ privot && $ left <$ right){ $ arr [$ right] = $ arr [$ left]; $ right--; } while($ arr [$ right]> $ privot && $ left <$ right){ $ right--; } if($ arr [$ right] <$ privot && $ left <$ right){ $ arr [$ left] = $ arr [$ right]; $ left ++; } } $ arr [$ left] = $ privot; $ leftを返します。 }
並べ替えプロセスでは、元のサイズの順序(456)が中断されるため、高速並べ替えは安定した並べ替えアルゴリズムではありません