アルゴリズムはプログラムの中核であり、アルゴリズムの品質がプログラムの品質を決定する、と多くの人が言います。私はジュニア PHPer ですが、アルゴリズムに関する知識はほとんどありません。ただし、基本的なソート アルゴリズムはプログラム開発に不可欠なツールであるため、マスターする必要があります。ここでは、バブル ソート、挿入ソート、選択ソート、クイック ソートの 4 つの基本アルゴリズムを紹介し、アルゴリズムの考え方を分析します。
前提: バブルソート、クイックソート、選択ソート、挿入ソートを使用して、以下の配列内の値を小さいものから大きいものの順に並べ替えます。 $arr(1,43,54,62,21,66,32,78,36,76,39);
1. バブルソート
アイデア分析: 並べ替える数字のグループで、まだ並べ替えられていない数列について、大きい数字が下に沈むように、隣り合う 2 つの数字を前から後ろに比較して調整します。小さい方が上に上がっていきます。つまり、2 つの隣接する数値が比較され、それらの順序が順序要件と逆であることが判明するたびに、それらは交換されます。
コードの実装:
$arr=array(1,43,54,62,21,66,32,78,36,76,39); - function bubbleSort($arr)
- {
- $ len=count($arr);
- //このループ層は、バブルする必要があるラウンド数を制御します
- for($i=1;$i { //このループ層は各ラウンドの制御に使用されます 数値を比較する必要がある回数
- for($k=0;$k {
- if($arr[$k]>$arr [$k+1])
- {
- $tmp=$arr[$k+1];
- $arr[$k+1]=$arr[$k];
- $arr[$k]=$tmp;
- }
- }
- }
- return $arr;
- }
-
コードをコピー
2. 並べ替えを選択します
アイデア分析: 並べ替える一連の数値の中から最小の数値を選択し、それを最初の位置の数値と交換します。次に、残りの数値の中から最小のものを見つけて、それを 2 番目の数値と交換します。このループは、最後から 2 番目の数値が最後の数値と比較されるまで続きます。
コード実装:
function selectSort($arr) {- //二重ループが完了し、外側の層はラウンド数を制御し、内側の層は比較の数を制御します
- $len=count( $arr);
- for($ i=0; $i //最初に最小値の位置を仮定します
- $p = $i;
-
- for($j=$ i+1; $j //$arr[$p] は現在知られている最小値です
- if($arr[$p] > $arr[$j]) {
- / /比較して小さい値を見つけ、最小値の位置を記録し、次の比較で既知の最小値を使用します。
- $p = $j;
- }
- }
- //現在の最小値の位置が決定され、$p に保存されました。最小値の位置が現在仮定されている位置$iと異なることが判明した場合には、位置を入れ替えることができる。
- if($p != $i) {
- $tmp = $arr[$p];
- $arr[$p] = $arr[$i];
- $arr[$i] = $tmp;
- }
- }
- //最終結果を返す
- return $arr;
- }
-
コードをコピー
3. 挿入ソート
アイデア分析: 並べ替える一連の数値において、前の数値がすでに順序どおりであると仮定すると、今度は、これらの n 数値も順序どおりになるように、前の順序の数値に n 番目の数値を挿入する必要があります。すべてが整うまでこのサイクルを繰り返します。
コードの実装:
function insertSort($arr) {- $len=count($arr);
- for($i=1, $i<$len; $i++) {
- $tmp = $arr[$i];
- //内部ループ制御、比較および挿入
- for($j=$i-1;$j>=0;$j--) {
- if($tmp < $arr [ $j]) {
- //挿入された要素が小さいことが判明したので、位置を交換し、後の要素を前の要素と交換します
- $arr[$j+1] = $arr[$j];
- $ arr[ $j] = $tmp;
- } else {
- //移動する必要のない要素が見つかった場合、それはソートされた配列であるため、前の要素を再度比較する必要はありません。
- break;
- }
- }
- }
- return $arr;
- }
-
コードをコピー 4. クイックソート
アイデア分析: ベンチマーク要素 (通常は最初の要素または最後の要素) を選択します。 1 回のスキャンで、ソート対象の列が 2 つの部分に分割され、1 つの部分は参照要素より小さく、もう 1 つの部分は参照要素以上になります。このとき、ベース要素はソート後の正しい位置にあり、分割された 2 つの部分も同様に再帰的にソートされます。
コード実装:
- function QuickSort($arr) {
- //まず続行する必要があるかどうかを決定します
- $length = count($arr);
- if($length <= 1) {
- return $arr;
- }
- //最初の要素をベースとして選択します
- $base_num = $arr[0];
- //ルーラーを除くすべての要素をスキャンし、サイズ関係に従って 2 つの配列に入れます
- //初期化両方の配列
- $left_array = array(); // ベースラインより小さい
- $right_array = array(); // ベースラインより大きい
- for($i=1; $i if ($base_num > $arr[$i]) {
- //左の配列を入れる
- $left_array[] = $arr[$i];
- } else {
- //右の配列を入れる
- $right_array[ ] = $arr[ $i];
- }
- }
- //次に、左と右の配列に対して同じソートを実行し、この関数を再帰的に呼び出します
- $left_array = Quick_sort($left_array);
- $right_array = Quick_sort($right_array );
- //マージ
- return array_merge($left_array, array($base_num), $right_array);
- }
コードをコピー
原文: http://www.php100.com/html/dujia/2015/0210/8604.html
|