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つの部分に分けることができます.
これにより再帰的な開始ステップが得られる
アルゴリズムの実装:
quicksort
高速ソートアルゴリズムでは,分治戦略を用いた.まずシーケンスを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;
}
}