まず最初に、バブルソーティングの考え方について話しましょう。その後、多くの学生はバブルソーティング法とは何ですか?と尋ねます。
以下で説明しましょう:
例を見てみましょう:
配列 array(23,34,12,56,43,98,89) があります。その要素をバブルソートを使用して並べ替えてみましょう。
$arr = 配列(23,34,12,56,43,98,89);
for($i=0;$i
$tmp = $arr[$j];
$arr[$j] = $arr[$j+1];
$arr[$j+1] = $tmp;
}
}
}
?>
上記の例では、内部の for ループは配列内のすべての要素を 1 つずつ比較します。つまり、配列内の最初の要素と 2 番目の要素が比較され、2 番目の要素が 2 番目の要素と比較されます。 3つの要素、
次に、配列内の 2 つの要素の位置を交換する方法を考えます
この問題を解決するには、中間コンテナ変数を使用できます
つまり、交換する必要がある最初の変数の値をコンテナ変数に代入し、次に交換する必要がある 2 番目の変数の値を最初の変数に代入し、次にコンテナ変数の値を 2 番目の変数に代入します。変数。
ステップ 1: 中間コンテナ変数 $tmp:
ステップ 2: $arr[$j] の値を $tmp に代入します
ステップ 3: $arr[$j+1] を $arr[$j] に代入します
ステップ 4: 中間変数の値を $arr[$j+1] に代入して交換を完了します
最後から 2 番目の要素と配列の最後の要素の比較が完了するまで、合計の比較は count($arr)-1 回行われます。 この時点で、配列の最初のソートが完了しています。つまり、配列内の最大の数値が配列の最後に配置されています。つまり、www.2cto が実行されています。コム
次に、2 番目と 3 番目のパスを実行する必要があります...ソートを一度に 1 パスずつ実行し、ソートが完了している限り、合計は count ( $arr) 回。 ここまで述べましたが、外側の for ループの意味は理解できましたか? さて、問題を考えてみましょう。配列内の要素がペアで比較される場合、各比較で最大数が排出されます。
ということは、次回の比較では前回キューに入れられた最大数との比較を行うべきではないでしょうか
?
つまり、最初のソートの後、98 が配列の最後に配置されます。これにより、次のソートで 98 を比較する必要がなく、効率が向上し、リソースが節約されます。
したがって、次のように書くことができます:
$arr = 配列(23,34,12,56,43,98,89);
for($i=0;$i
続けます;
}
if($arr[$j]>$arr[$j+1]){
$tmp = $arr[$j];
$arr[$j] = $arr[$j+1];
$arr[$j+1] = $tmp;
}
}
}
?>
上記のコードでは、内側のループの実行回数は count($arr)-$i,
となります。
つまり、各パスで配列内のすべての要素を比較した後、次回ソートが実行されるときに、ソートの数が 1 つ減ります。
つまり、前回の比較で得られた最大値の比較を除外することで、効率が大幅に向上します
。
PHP の組み込み関数 microtime() を使用して、ソート前に 1 回、ソート後に 1 回実行し、その 2 回を減算して処理時間を取得できます。
比較すると、バブルソーティングの第 2 の選別方法の効率が第 1 の選別方法よりも高いと結論付けることができますが、それはここで検証できるため、ここでは詳しく説明しません。
$arr = 配列(23,34,12,56,43,98,89);
関数クイック($arr){
$left = array();
$right = array();
いわゆるクイック ソートでは、$arr 配列内の任意の値を中間値として選択し、この値を配列内の他のすべての要素と比較します。この値より小さいものは左側に配置され、この値より大きいものは左側に配置されます。同様に、この値の左側の数値は上記のようにソートされ、右側の数値はすべての値が揃うまでソートされます。を比較します。
上記のコードを見てみましょう:
まず、クイックソートの概念を使用するには、再帰を使用する必要があります。再帰に関しては、関数を使用して自分自身を呼び出し、層ごとに深く進み、最終的に取得した値を返すというアイデアです。 .
まず、関数quick()をカスタマイズし、この関数自体を呼び出す必要があります。
ここでは、中間値として $arr[0] を使用します。これは任意に選択されるものであり、必須ではありません。
誰もが明確に考えられるように、最初に 2 つのカップに相当する 2 つの空の配列を定義します
$arr[0] を配列内のすべての値と比較します。$arr[0] より小さい値は最初のカップに配置され、$arr[0] より大きい値は 2 番目のカップに配置されます。 2 杯目は、それぞれ $left と $right です
指定された配列要素の要素が 1 つしかない場合、または空の場合は、クイック関数によって配列が返され、次の内容は実行されないと判断します。
次に、配列を走査し、走査された値を $arr[0] と比較します。 $arr[0] より小さい値は $left 配列に格納され、$arr[0] より大きい値は$left 配列に格納されると、この時点でソートが完了します。
次に、$left 配列と $right 配列に対して同じ操作を実行します。つまり、関数自体を呼び出し、$left 配列または $right 配列の配列要素が 1 つになるまで $left 配列と $right 配列を渡します。自分に電話して直接戻ってください
最後に、左の配列、$arr[0]、$right の配列をマージして、最終的な並べ替え結果を取得します。
訂正:
この問題にご注目いただき、修正していただきありがとうございます。これはオープンなプラットフォームです。自由に話し、もっとコミュニケーションをとり、一緒に進歩してください。
zdrjlampより抜粋