PHP中常见的四种算法
分别用冒泡排序法,快速排序法,选择排序法,插入排序法将下面数组中的值按照从小到大的顺序进行排序。 15,33,5,89,6,4
1.冒泡排序
原理分析:
- 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
- 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
- 针对所有的元素重复以上的步骤,除了最后一个。
- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
代码实现:
<?php
/**
* Created by PhpStorm.
* User: admin
* Date: 2017/10/30
* Time: 16:23
*/
$arr = [15,33,5,89,6,4];
function bubbleSort($arr)
{
$count = count($arr);
//该层循环控制 需要冒泡的轮数
for ($i=0; $i<$count; $i++)
{
//该层循环用来控制每轮 冒出一个数 需要比较的次数
for ($k=0; $k<$count-$i-1; $k++){
if($arr[$k]>$arr[$k+1])
{
$tmp = $arr[$k+1];
$arr[$k+1] = $arr[$k];
$arr[$k] = $tmp;
}
}
}
return $arr;
}
var_dump(bubbleSort($arr));
最后结果:
array(6) { [0]=> int(4) [1]=> int(5) [2]=> int(6) [3]=> int(15) [4]=> int(33) [5]=> int(89) }
2.快速排序法
原理分析:
- 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
代码实现:
<?php
/**
* Created by PhpStorm.
* User: admin
* Date: 2017/10/30
* Time: 17:26
*/
$arr = [15,33,5,89,6,4];
function quickSort($arr){
//判断是不是还有进行
if (count($arr)>1){
//指定基准
$k = $arr[0];
//设置左边数组
$x = [];
//设置右边数组
$y = [];
for ($i=1; $i<count($arr); $i++)
{
//进行判断
if ($k>$arr[$i]){
$x[] = $arr[$i];
}else{
$y[] = $arr[$i];
}
}
//递归执行
$x = quickSort($x);
$y = quickSort($y);
//合并数组
return array_merge($x,array($k),$y);
}else {
return $arr;
}
}
var_dump(quickSort($arr));
最后结果:
array(6) { [0]=> int(4) [1]=> int(5) [2]=> int(6) [3]=> int(15) [4]=> int(33) [5]=> int(89) }
3.选择排序法
原理分析:
- 在数组中,选出最小的一个数与第一个位置的数交换。然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。
代码实现:
<?php
/**
* Created by PhpStorm.
* User: admin
* Date: 2017/10/30
* Time: 18:10
*/
$arr = [15,33,5,89,6,4];
function selectSort($arr)
{
$count = count($arr);
for($i=0; $i<$count-1; $i++) {
//先假设最小的值的位置
$p = $i;
for($j=$i+1; $j<$count; $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;
}
var_dump(selectSort($arr));
最后结果:
array(6) { [0]=> int(4) [1]=> int(5) [2]=> int(6) [3]=> int(15) [4]=> int(33) [5]=> int(89) }
4.插入排序法
原理分析:
- 每步将一个待排序的纪录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。
代码实现:
<?php
/**
* Created by PhpStorm.
* User: admin
* Date: 2017/10/30
* Time: 18:20
*/
$arr = [15,33,5,89,6,4];
function insertSort($arr)
{
$count = count($arr);
for($i=1; $i<$count; $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;
}
var_dump(insertSort($arr));
最后结果:
array(6) { [0]=> int(4) [1]=> int(5) [2]=> int(6) [3]=> int(15) [4]=> int(33) [5]=> int(89) }
算法是一门高深的学问 :)