php中的冒泡和快速排序算法

本文介绍了PHP中的排序方法,包括系统内置排序函数sort()及其变种usort()的应用,还详细解释了冒泡排序和快速排序两种经典算法的实现方式及优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
)

快速排序法是排序算法中最高效的一种,但是需要很多内存空间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值