PHP実現quicksort


php->quicksort
quicksort
高速ソートアルゴリズムでは,分治戦略を用いた.まずシーケンスを2つのサブシーケンスに分け,シーケンス全体のソートが終了するまでサブシーケンスを再帰的にソートする.(つまり二つに分かれた思想)
手順は次のとおりです.
  • シーケンスでキー要素を軸として選択します.
  • シーケンスを並べ替え、軸より小さい要素を軸の前に移動し、軸より大きい要素を軸の後ろに移動します.分割を行った後、軸はその最終的な位置にあります.
  • は、2つのサブシーケンスを再帰的に並べ替える:より小さな要素を含むサブシーケンスと、より大きな要素を含むサブシーケンス.

  • 例えばシーケンス
    $arr:
    5 3 0 11 44 7 23 2最初の要素$arr[0]=5を軸設定フラグビットlow...topは先頭を表します
    2 3 0 11 44 7 23 2反対方向(右)から比較:2<5最初の位置を2に置き換え、low++
    2 3 0 11 44 7 23 11反対方向(左)から比較を開始:5<11最後の位置を11に置き換え、top–
    low==topがその位置を軸要素である5に置き換えるまで、以上の手順を繰り返します.
    2 3 0 5 44 7 23 11
    これにより、2 3 0と44 23 11の2つの部分に分けることができます.
    これにより再帰的な開始ステップが得られる
    アルゴリズムの実装:
    class quick_sort{
    
            function quicksort(&$arr,$low,$top){
                if($low < $top){
                   $pivotpos = $this->partition($arr,$low,$top);
                   $this->quicksort($arr,$low,$pivotpos-1);
                   $this->quicksort($arr,$pivotpos+1,$top); 
                }
    
            }
            function partition(&$arr, $low ,$top){
                if($low == $top){
                    return;
                }
        //       
                $com = $arr[$low];
                while($low!=$top){
        //              
                    while($top&&$top!=$low){
                        if($com > $arr[$top]){
                        $arr[$low++] = $arr[$top];
                        break;
                        }else{
                            $top--;
                        }
                    }
        //              
                    while($low&&$low!=$top){
                        if($com < $arr[$low]){
                            $arr[$top--] = $arr[$low];
                            break;
                        }else{
                            $low++;
                        }
                    }
                }
                $arr[$low] = $com;
                return $low;
    
            }
        }