今回は、PHP 直接挿入ソートの事例分析をお届けします。PHP 直接挿入ソートの 注意点 とは何ですか? ここで実際の事例を見てみましょう。
アルゴリズムの紹介:
ポーカーは、私たちのほぼ全員がプレイしたことのあるゲームです。通常、開始時に 1 人がカードを配り、他の人がカードを引いて並べ替えます。最初に引いたカードが 5 で、2 番目のカードが 3 であれば、当然、3 番目のカードを挿入します。カードが 4 の場合は 3 と 5 の間で見つけ、4 番目のカードは 6 の場合は 5 の後ろに置き、5 番目のカードは 2 の場合は 3 の前に挿入します。最後に、すべてのカードを引き終わったら、手札のカードを小さいものから大きいもの(ポイント)に分類します。
このシーケンスを見てみましょう:
5 3 3 5 // 要素が 1 つだけある順序付きリストに 3 を挿入します 5
3 5 4 4 // 要素が 2 つある順序付きリストに 4 を挿入します 3 5
3 4 5 // 2 つの要素を持つ順序付きリストに 6 を挿入します 3 4 5
3 4 5 6 2 / / 2 つの要素を持つ順序付きリストに 2 を挿入します 3 4 5 6
2 3 4 5 6
基本的な考え方:
直接挿入ソートの基本的な考え方は、順序なしリストから毎回最初の要素を取り出し、順序付きリストの適切な位置に挿入することで、順序付きリストに順序が残るようにすることです。
最初のパスは最初の 2 つの数値を比較し、サイズに従って 2 番目の数値を順序付きリストに挿入します。2 番目のパスは 3 番目のデータと最初の 2 つの数値を後ろから前にスキャンし、3 番目の数値を順序付きリストに挿入します。サイズに従って順序付きリストに挿入し、順番に処理を進め、(n-1) 回のスキャン後にソート処理全体が完了します。
直接挿入ソートは 2 レベルのネストされたループで構成されます。外側のループは、比較する値を識別して決定します。内側のループは、比較される値の最終位置を決定します。直接挿入ソートでは、比較対象の値とその前の値が比較されるため、外側のループは 2 番目の値から始まります。現在の値が比較対象の値より大きい場合、比較対象の値より小さい値が見つかるまでループ比較が継続され、比較対象の値が次の位置に配置されてサイクルが終了します。
挿入ソートの基本的な方法は次のとおりです。各ステップで、すべてのレコードが挿入されるまで、キーのサイズに従って、ソート対象のレコードが以前にソートされたシーケンス内の適切な位置に挿入されます。
アルゴリズム実装:
<?php //直接插入排序 function swap(array &$arr,$a,$b){ $temp = $arr[$a]; $arr[$a] = $arr[$b]; $arr[$b] = $temp; } function InsertSort(array &$arr){ $count = count($arr); //数组中第一个元素作为一个已经存在的有序表 for($i = 1;$i < $count;$i ++){ $temp = $arr[$i]; //设置哨兵 for($j = $i - 1;$j >= 0 && $arr[$j] > $temp;$j --){ $arr[$j + 1] = $arr[$j]; //记录后移 } $arr[$j + 1] = $temp; //插入到正确的位置 } } $arr = array(9,1,5,8,3,7,4,6,2); InsertSort($arr); var_dump($arr);
実行結果:
array(9) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> int(4) [4]=> int(5) [5]=> int(6) [6]=> int(7) [7]=> int(8) [8]=> int(9) }
直接挿入ソートアルゴリズムの時間計算量はO(n^2)です。
直接挿入ソートは安定したソートです。
この記事の事例を読んだ後は、この方法を習得したと思います。さらに興味深い情報については、php 中国語 Web サイトの他の関連記事に注目してください。
推奨読書:
PHP クイックソートアルゴリズムを使用する手順の詳細な説明
以上がPHP直接挿入ソートケース分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。