PHP有4种基本排序算法,分别是:冒泡排序,选择排序,插入排序,快速排序。
本篇文章给初学者细讲下冒泡排序。
首先是一个数组:
$ars = [4,3,5,9,6,2];
这是一个有6个元素的数组,那么开始使用冒泡排序,首先理解下冒泡排序,原理简单说明就是:两两比较,值大的往后放
那么问题来了,一共要比较多少次呢?我们先来看第一次比较
第一次:数组的第一个元素跟第二个元素比较,4>3,所以,4要往后放 [3,4,5,9,6,2]
第二次:数组的第二个元素(这时候已经是4了,不是3了)跟第三个元素比较,4<5,不动 [3,4,5,9,6,2]
第三次:数组的第三个元素跟第四个元素比较,5<9,不动 [3,4,5,9,6,2]
第四次:数组的第四个元素跟第五个元素比较,9>6,9要往后放 [3,4,5,6,9,2]
第五次:数组的第五个元素跟第六个元素比较,9>2,9要往后放 [3,4,5,6,2,9]
第六次:第六个元素没有比较对象,所以结束了(很多人迷惑为什么代码是那样写的,问题可能就在这里)
5次比较下来,只得到一个9在最后面,那么就需要循环来遍历不断的进行第二轮的比较
注意:第二轮比较只需要4次,因为上面5次比较已经得到最大值了,也就是说已经冒泡成功了一个
由此可以得到逻辑:
1、循环轮次:数组长度-1次,(为什么减一?看上面第六次的解释)
2、每轮需要循环的次数:数组的长度-当前正在循环的轮次(解释:因为每循环一轮就会冒泡一次,已经冒泡成功了的就不需要再进行比较了,拿上面的数组为例:一共5轮,每轮冒泡后,进入下一轮的循环就要减去上一轮,也就是说第二轮只需要循环4次)
3、每轮每次的循环比较是前一个元素跟后一个元素比较,上面5次解释已经说的很清楚了
4、每次得到的结果,如果符合大小对比,就把大的值往后放,也就是值对调
由上面的逻辑可得到如下代码:
<?php
$ars = [4,3,5,9,6,2];
$len = count($ars);
for($i=1;$i<$len;$i++){
//此循环是控制一共要多少轮
for($k=0;$k<$len-$i;$k++){
//此循环是控制每轮需要循环多少次
if($ars[$k] > $ars[$k+1]){
//此判断是比较值的大小,进行值对调
$temp = $ars[$k+1];
$ars[$k+1] = $ars[$k];
$ars[$k] = $temp;
}
}
}
?>
如果你要封装成一个类,那么请复制下面的代码:
<?php
/**
* @author 代码要往死里写才有用
* @since 2018.11.18 20:28
* PHP冒泡排序类
*/
class Mp
{
public $arrays;
public $len;
/**
* 构造函数
* 初始化数组
*/
public function __construct($array_to)
{
//如果可以,你可以加上变量类型控制
$this->arrays = $array_to;
$this->len = count($array_to);
}
/**
* 冒泡排序
*/
public function getMp()
{
try
{
for($i=1;$i<$this->len;$i++){
for($k=0;$k<$this->len-$i;$k++){
if($this->arrays[$k] > $this->arrays[$k+1]){
$up = $this->arrays[$k+1];
$this->arrays[$k+1] = $this->arrays[$k];
$this->arrays[$k] = $up;
}
}
}
} catch( Exception $e )
{
echo 'Caught exception: ', $e->getMessage(), "\n";
}
return $this->arrays;
}
}
?>
其他排序,后文更进!