1、系统内置排序函数
<?php
//排序算法
$arr = [3,1,7,9,5,4];
sort($arr);
print_r($arr);
Array
(
[0] => 1
[1] => 3
[2] => 4
[3] => 5
[4] => 7
[5] => 9
)
上面是对简单数据类型的排序,那么给类对象排序呢?
class User
{
public $age;
public function __construct($age)
{
$this->age = $age;
}
}
$arr = [
new User(3),
new User(1),
new User(7),
new User(9),
new User(5),
new User(4),
];
sort($arr);
print_r($arr);
我们发现sort
函数对这个简单的User类
对象也能排序
Array
(
[0] => User Object
(
[age] => 1
)
[1] => User Object
(
[age] => 3
)
[2] => User Object
(
[age] => 4
)
[3] => User Object
(
[age] => 5
)
[4] => User Object
(
[age] => 7
)
[5] => User Object
(
[age] => 9
)
)
如果User类
复杂一点:
class User
{
public $age;
public $name;
public function __construct($name,$age)
{
$this->age = $age;
$this->name = $name;
}
}
我们可以使用另外一个函数usort
来指定按照age
排序:
usort($arr,function ($a,$b){
if ($a->age == $b->age){
return 0;
}
return $a->age > $b->age ? 1 : -1;
});
2、冒泡排序
n个数字来排序,外层循环n-1,内层循环n-1-i,比较j和j+1,并交换
$arr = [3,1,7,9,5,4];
$n = count($arr);
for ($i=0;$i<$n-1;$i++){
for ($j=0;$j<$n-1-$i;$j++){
if ($arr[$j] > $arr[$j+1]){
$temp = $arr[$j];
$arr[$j] = $arr[$j+1];
$arr[$j+1] = $temp;
}
}
}
冒泡排序是每个数字,逐个检查。算法简单稳定,不需要额外空间。但是效率很低,循环太多。
3、快速排序
取第一个出来,<=它的,放左边,否则放右边。然后递归,最后合并
function quick_sort(array $arr){
if (count($arr) <= 1){
return $arr;
}
$x = array();
$y = array();
$n = count($arr);
//第一个成员
$k = $arr[0];
for ($i=1;$i<$n;$i++){
if ($arr[$i] <= $k){
$x[] = $arr[$i];
}else{
$y[] = $arr[$i];
}
}
//递归接着排序
$x = quick_sort($x);
$y = quick_sort($y);
return array_merge($x,array($k),$y); //这里合并要注意顺序
}
$arr = [3,1,7,9,5,4];
$newArr = quick_sort($arr);
print_r($newArr);
Array
(
[0] => 1
[1] => 3
[2] => 4
[3] => 5
[4] => 7
[5] => 9
)
快速排序法是排序算法中最高效的一种,但是需要很多内存空间。