多くの人が、アルゴリズムはプログラムの中核であり、プログラムは悪いよりも優れていると言います。重要なのは、プログラムのアルゴリズムの長所と短所にあります。ジュニアphperとして、彼はめったにアルゴリズムと接触しませんが。しかし、バブルソート、挿入ソート、選択ソート、クイックソートの4つの基本的なアルゴリズムについては、まだ習得する必要があると思います。
需求:分别用 冒泡排序法,快速排序法,选择排序法,插入排序法,归并排序将下面数组中 的值按照从小到大的顺序进行排序。
$arr=array(11,3,56,62,21,66,32,78,36,76,39,88,34);
1.バブルソート
はじめに:
バブルソートは単純なソートアルゴリズムです。ソートするシーケンスに繰り返しアクセスし、2つの要素を順番に比較し、順序が間違っている場合は交換しました。シーケンスにアクセスする作業は、交換が不要になるまで、つまりシーケンスがソートされるまで繰り返されます。このアルゴリズムの名前の由来は、要素が小さいほど、交換によってシーケンスの先頭にゆっくりと「フロート」するためです。
ステップ:
1.隣接する要素を比較します。最初のものが2番目のものよりも大きい場合は、2つを交換します。
2.最初の最初のペアから最後の最後のペアまで、隣接する要素の各ペアに対して同じ作業を行います。この時点で、最後の要素が最大数になるはずです。
3.最後の要素を除くすべての要素に対して上記の手順を繰り返します。
4.比較する数値のペアがなくなるまで、毎回、要素の数を減らして上記の手順を繰り返します。
<?php
$arr = [1, 43, 54, 62, 21, 66, 32, 78, 36, 76, 39, 2];
//冒泡排序
function bubbleSort($arr) {
$len = count($arr);
//该层循环控制 需要冒泡的轮数
for ($i = 1; $i < $len; $i++) {
//该层循环用来控制每轮 冒出一个数 需要比较的次数
for ($k = 0; $k < $len - $i; $k++) {
if ($arr[$k] > $arr[$k + 1]) {
//从小到大 < || 从大到小 >
$tmp = $arr[$k + 1]; // 声明一个临时变量
$arr[$k + 1] = $arr[$k];
$arr[$k] = $tmp;
}
}
}
return $arr;
}
$arr = bubbleSort($arr);
print_r($arr);
並べ替え効果:
2。並べ替えを選択します
はじめに:
選択ソートは、シンプルで直感的なソートアルゴリズムです。次のように動作します。最初にソートされていないシーケンスで最小の要素を見つけ、それをソートされたシーケンスの最初に格納し、次に残りのソートされていない要素から最小の要素を見つけ続け、次にそれをソートされたシーケンスの最後に置きます。など、すべての要素が並べ替えられるまで続きます。
<?php
$arr = [1, 43, 54, 62, 21, 66, 32, 78, 36, 76, 39, 2];
//选择排序
//实现思路 双重循环完成,外层控制轮数,当前的最小值。内层控制比较次数
function selectSort($arr) {
$len = count($arr);
//$i 当前最小值的位置, 需要参与比较的元素
for ($i = 0; $i < $len - 1; $i++) {
//先假设最小的值的位置
$p = $i;
//$j 当前都需要和哪些元素比较,$i 后边的。
for ($j = $i + 1; $j < $len; $j++) {
//$arr[$p] 是 当前已知的最小值
//比较,发现更小的,记录下最小值的位置;并且在下次比较时,应该采用已知的最小值进行比较。
$p = ($arr[$p] <= $arr[$j]) ? $p : $j;
}
//已经确定了当前的最小值的位置,保存到$p中。
//如果发现 最小值的位置与当前假设的位置$i不同,则位置互换即可
if ($p != $i) {
$tmp = $arr[$p];
$arr[$p] = $arr[$i];
$arr[$i] = $tmp;
}
}
//返回最终结果
return $arr;
}
$arr = selectSort($arr);
print_r($arr);
3.挿入ソート
はじめに:
挿入ソートのアルゴリズムの説明は、シンプルで直感的なソートアルゴリズムです。順序付けられたシーケンスを作成することで機能します。ソートされていないデータの場合は、ソートされたシーケンスで後ろから前にスキャンし、対応する位置を見つけて挿入します。挿入ソートは通常、インプレースソート(つまり、O(1)の余分なスペースのみを必要とするソート)によって実装されるため、後方から前方にスキャンするプロセスでは、ソートされた要素を後方に繰り返しシフトする必要があります。最新の要素の挿入スペースを提供します。
ステップ:
1.最初の要素から始めて、要素は並べ替えられたと見なすことができます
2.次の要素を取り出し、並べ替えられた要素のシーケンスで後ろから前にスキャンします
3.要素(並べ替えられた)が新しい要素よりも大きい場合、it要素を次の位置に移動します
。4。並べ替えられた要素が新しい要素以下になる位置が見つかるまで手順3を繰り返します
。5。新しい要素を位置
6に挿入します。手順2を繰り返します。
<?php
$arr = [1, 43, 54, 62, 21, 66, 32, 78, 36, 76, 39,2];
//插入排序
function insert_sort($arr)
{
$len=count($arr);
for($i=1; $i<$len; $i++) {
//获得当前需要比较的元素值
$tmp = $arr[$i];
//内层循环控制 比较 并 插入
for($j=$i-1; $j>=0; $j--) {
//$arr[$i];需要插入的元素
//$arr[$j];需要比较的元素
if($tmp < $arr[$j]) //从小到大 < || 从大到小 >
{
//发现插入的元素要小,交换位置
//将后边的元素与前面的元素互换
$arr[$j+1] = $arr[$j];
//将前面的数设置为 当前需要交换的数
$arr[$j] = $tmp;
} else {
//如果碰到不需要移动的元素
//由于是已经排序好是数组,则前面的就不需要再次比较了。
break;
}
}
}
//将这个元素 插入到已经排序好的序列内。
//返回
return $arr;
}
$arr = insert_sort($arr);
print_r($arr);
4.クイックソートの
概要:
クイックソートは、TonyHallによって開発されたソートアルゴリズムです。平均して、n個のアイテムを並べ替えるにはΟ(n log n)の比較が必要です。最悪の場合、Ο(n2)の比較が必要ですが、この状況は一般的ではありません。実際、クイックソートは通常、他のΟ(n log n)アルゴリズムよりも大幅に高速です。これは、その内部ループがほとんどのアーキテクチャとほとんどの実際のアプリケーションで効率的に実装できるためです。データは設計の選択を決定し、必要な時間の2次項。
ステップ:
1.シーケンスから要素を選択し、それを「ピボット」と呼びます
。2 。参照値よりも小さいすべての要素が参照の前に配置され、参照値よりも大きいすべての要素が後ろに配置されるように、シーケンスを並べ替えます。参照(同じ番号はどちらの側にも行くことができます)。このパーティションが終了した後、ベンチマークはシーケンスの途中にあります。これは、パーティション操作と呼ばれます。
3.参照値よりも小さい要素のサブシーケンスと、参照値よりも大きい要素のサブシーケンスを再帰的に並べ替えます。
<?php
$arr = [1, 43, 54, 62, 21, 66, 32, 78, 36, 76, 39,2];
//快速排序
function quick_sort($arr)
{
//判断参数是否是一个数组
if(!is_array($arr)) return false;
//递归出口:数组长度为1,直接返回数组
$length = count($arr);
if($length<=1) return $arr;
//数组元素有多个,则定义两个空数组
$left = $right = array();
//使用for循环进行遍历,把第一个元素当做比较的对象
for($i=1; $i<$length; $i++)
{
//判断当前元素的大小
if($arr[$i] < $arr[0]){
//从小到大 < || 从大到小 >
$left[]=$arr[$i];
}else{
$right[]=$arr[$i];
}
}
//递归调用
$left=quick_sort($left);
$right=quick_sort($right);
//将所有的结果合并
return array_merge($left,array($arr[0]),$right);
}
$arr = quick_sort($arr);
print_r($arr);