php 排序算法

一、冒泡排序

每次把当前数组剩余数中最大或最小的数(取决于排序方式)放在靠右的位置,经过数组元素个数减1次后,就可以得到排序结果。

在这里插入图片描述

例:


function maopaoSort($arr)
{
    $count = count($arr);

    //循环 $count-1 次
    for ($i = 0; $i < $count - 1; $i++) {

        //每次要比较 $count-1-$i 次
        for ($j = 0; $j < $count - 1 - $i; $j++) {

            //如果前一个数字大于后一个数字,两者对调
            if ($arr[$j] > $arr[$j + 1]) {
                list($arr[$j], $arr[$j + 1]) = [$arr[$j + 1], $arr[$j]];
            }
        }

    }

    print_r($arr);

}

//要排序的数组信息
$sort_arr = [1, 5, 3, 2, 4];

maopaoSort($sort_arr);

结果:


Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
)

二、选择排序

每次把当前数组剩余数中最大或最小的数(取决于排序方式)放在当前元素所在位置进行替换,经过数组元素个数减1次后,就可以得到排序结果。

在这里插入图片描述

例:


function xuanzeSort($arr)
{
    $count = count($arr);

    //循环 $count-1 次,因为只要前面都确定了,最后一个就确定了
    for ($i = 0; $i < $count - 1; $i++) {
        
        $min_val = $arr[$i]; //最小值初始化
        $min_key = $i;  //最小值key初始化

        //每次要比较 $count-1-$i 次
        for ($j = 0; $j < $count - 1 - $i; $j++) {

            //如果前一个数字大于后一个数字,则更新最小值和最小值key
            if ($min_val > $arr[$j+$i+1]) {
                $min_val = $arr[$j+$i+1];
                $min_key = $j+$i+1;
            }
        }

        //当前值和最小值位置对调
        if($i != $min_key){
            list($arr[$i],$arr[$min_key]) = [$arr[$min_key],$arr[$i]];
        }

    }

    print_r($arr);

}

$sort_arr = [1, 5, 3, 2, 4];

xuanzeSort($sort_arr);

结果:


Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
)

三、插入排序

每次把当前元素,与前面排好序的数组进行比较,插入到合适的位置,使其生成一个新的排好序的数组,经过数组元素个数减1次后,就可以得到排序结果。

在这里插入图片描述

例:


function charuSort($arr)
{
    $count = count($arr);

    //循环 $count-1 次,因为第一个代表已经排好序了,所以从第二开始
    for ($i = 1; $i < $count; $i++) {

        $insert_val = $arr[$i]; //要插入的值
        $insert_key = $i-1;  //要插入的key初始化

        //当要插入的值比排好序的值小,则排好序的值索引向后偏移一位
        while ($insert_key>=0 && $insert_val<$arr[$insert_key]){
            $arr[$insert_key+1] = $arr[$insert_key];
            $insert_key--;
        }

        //当要插入的值比排好序的值相等或大于时,则要插入的值所在的位置就是空出来的索引值
        $arr[$insert_key+1] = $insert_val;

    }

    print_r($arr);

}

$sort_arr = [1, 5, 3, 2, 4];

charuSort($sort_arr);

结果:


Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
)

四、快速排序

将数组的第一个元素作为参照,比他大的放右边数组,比他小的放左边数组,然后再把左右边数组重复这样的操作,直到数组元素小于等于1位置,最后把结果进行合并,得出排序结果。

例:


function kuaisuSort($arr)
{

    //先判断是否需要继续进行
    $length = count($arr);
    if ($length <= 1) {
        return $arr;
    }

    //如果没有返回,说明数组内的元素个数 多余1个,需要排序
    //选择一个标尺
    //选择第一个元素
    $base_num = $arr[0];
    
    //遍历 除了标尺外的所有元素,按照大小关系放入两个数组内
    //初始化两个数组
    $left_array = array();//小于标尺的
    $right_array = array();//大于标尺的
    for ($i = 1; $i < $length; $i++) {
        if ($base_num > $arr[$i]) {
            //放入左边数组
            $left_array[] = $arr[$i];
        } else {
            //放入右边数组
            $right_array[] = $arr[$i];
        }
    }
    
    //再分别对 左边 和 右边的数组进行相同的排序处理方式
    //递归调用这个函数,并记录结果
    $left_array = kuaisuSort($left_array);
    $right_array = kuaisuSort($right_array);
    
    //合并左边 标尺 右边
    return array_merge($left_array, array($base_num), $right_array);
}

$sort_arr = [1, 5, 3, 2, 4];

print_r(kuaisuSort($sort_arr));

结果:


Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值