# 推奨: 「php メソッドによるクイック ソートの実装: 最初に PHP サンプル ファイルを作成し、次に Exchange 関数と main 関数を作成し、次に下位サブテーブルと上位サブテーブルを再帰的に並べ替え、最後に QuickSort アルゴリズムを呼び出します。
PHP ビデオ チュートリアル」
基本的な考え方: クイックソートはバブル ソートを改良したものです。彼の基本的なアイデアは、1 回のソートでソート対象のレコードを 2 つの独立した部分に分割することです。一方の部分のキーワードは、レコードのもう一方の部分のキーワードよりも小さいため、レコードの 2 つの部分をすばやく別々にソートできるようになります。全体 並べ替えプロセスは、シーケンス全体を順序付けるという目的を達成するために再帰的に実行できます。 基本的なアルゴリズムの手順: 例:6 2 7 3 8 9
$low = 0; $high = 5; $pivot = 6;
3 2 7 6 8 9 //这时候,$high 减小为 3 $low = 0; $high = 3; $pivot = 6;
3 2 6 7 8 9 //这时候,$high 减小为 3 $low = 2; $high = 3; $pivot = 6;
5 番目のステップは、3 番目のステップのプロセスを模倣することです。
3 2 6 7 8 9 //这时候,$high 减小为 3 $low = 2; $high = 2; $pivot = 6;
注: クイック ソートの最初のパスでは最終結果が直接得られず、k より大きい数値と k より小さい数値を k の両側に分割するだけです。最終結果を得るには、添字 2 の両側の配列に対してこの手順を再度実行し、正しい結果を得るために配列が分解できなくなる (データが 1 つだけになる) まで配列を分解する必要があります。
アルゴリズム実装://交换函数 function swap(array &$arr,$a,$b){ $temp = $arr[$a]; $arr[$a] = $arr[$b]; $arr[$b] = $temp; } //主函数: function QuickSort(array &$arr){ $low = 0; $high = count($arr) - 1; QSort($arr,$low,$high); }
QSort() 関数は再帰呼び出しプロセスであるため、カプセル化されます。
function QSort(array &$arr,$low,$high){ //当 $low >= $high 时表示不能再进行分组,已经能够得出正确结果了 if($low < $high){ $pivot = Partition($arr,$low,$high); //将$arr[$low...$high]一分为二,算出枢轴值 QSort($arr,$low,$pivot - 1); //对低子表($pivot左边的记录)进行递归排序 QSort($arr,$pivot + 1,$high); //对高子表($pivot右边的记录)进行递归排序 } }
//选取数组当中的一个关键字,使得它处于数组某个位置时,左边的值比它小,右边的值比它大,该关键字叫做枢轴 //使枢轴记录到位,并返回其所在位置 function Partition(array &$arr,$low,$high){ $pivot = $arr[$low]; //选取子数组第一个元素作为枢轴 while($low < $high){ //从数组的两端交替向中间扫描(当 $low 和 $high 碰头时结束循环) while($low < $high && $arr[$high] >= $pivot){ $high --; } swap($arr,$low,$high); //终于遇到一个比$pivot小的数,将其放到数组低端 while($low < $high && $arr[$low] <= $pivot){ $low ++; } swap($arr,$low,$high); //终于遇到一个比$pivot大的数,将其放到数组高端 } return $low; //返回high也行,毕竟最后low和high都是停留在pivot下标处 }
function swap(array &$arr,$a,$b){ $temp = $arr[$a]; $arr[$a] = $arr[$b]; $arr[$b] = $temp; } function Partition(array &$arr,$low,$high){ $pivot = $arr[$low]; //选取子数组第一个元素作为枢轴 while($low < $high){ //从数组的两端交替向中间扫描 while($low < $high && $arr[$high] >= $pivot){ $high --; } swap($arr,$low,$high); //终于遇到一个比$pivot小的数,将其放到数组低端 while($low < $high && $arr[$low] <= $pivot){ $low ++; } swap($arr,$low,$high); //终于遇到一个比$pivot大的数,将其放到数组高端 } return $low; //返回high也行,毕竟最后low和high都是停留在pivot下标处 } function QSort(array &$arr,$low,$high){ if($low < $high){ $pivot = Partition($arr,$low,$high); //将$arr[$low...$high]一分为二,算出枢轴值 QSort($arr,$low,$pivot - 1); //对低子表进行递归排序 QSort($arr,$pivot + 1,$high); //对高子表进行递归排序 } } function QuickSort(array &$arr){ $low = 0; $high = count($arr) - 1; QSort($arr,$low,$high); }
$arr = array(9,1,5,8,3,7,4,6,2); QuickSort($arr); var_dump($arr);
クイック ソートは比較的高度なソートであるため、20 世紀のトップ 10 アルゴリズムの 1 つとしてリストされています。 。 。 。これほど素晴らしいアルゴリズムがあるのに、そこから学ばないのはなぜでしょうか?
このアルゴリズムはすでに非常に優れていますが、上記のアルゴリズム プログラムにはまだ改善の余地があります。
以上がPHPでクイックソートを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。