高速ソート用の2種類のパーティション図

透かし、size_16、text_QDUxQ1RP5Y2a5a6i、color_FFFFFF、t_100、g_se、x_10、y_10、shadow_90、type_ZmFuZ3poZW5naGVpdGk =グラフィック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)が中断されるため、高速並べ替えは安定した並べ替えアルゴリズムではありません

php高速行の完全なコード

おすすめ

転載: blog.51cto.com/huangkui/2677733