常用排序算法:冒泡排序和快速排序

冒泡排序

<?php
declare(strict_types=1);

$sort = [10,9,8,7,6,5,4,3,2,1];

echo "初始:".implode(",",$sort).PHP_EOL;

// 排序次数为元素个数-1
for($i=1;$i<count($sort);$i++){
    // 因为每次排序都会吧最大的数移动到最后 
    // 所以最后一个不需要再次进行比较
    for($j=0;$j<count($sort)-$i;$j++){
        // 比较大小 把小的调换到前边
        if($sort[$j]>$sort[$j+1]){
            $tmp = $sort[$j];
            $sort[$j]=$sort[$j+1];
            $sort[$j+1]=$tmp;
        }
    }
    echo $i."轮:".implode(",",$sort).PHP_EOL;
}

echo "结果:".implode(",",$sort).PHP_EOL;

快速排序

<?php

// 随机取一个值  
// 通过先右后左 轮流判断的方式
// 把比他小的数放左边
// 把比他大的数放右边
// 找到要插入的位置
function findPos(&$arr, $L, $R) {

    // 将arr[L]数存起来 
    // 相当于把位置空出来 用来放置比arr[L]小的数
    $target = $arr[$L];   

    // 左右指针未重合 一个循环表示进行一次左右调换
    while ($L < $R) { 
        // 从右向左找小于target的数 如果不满足条件 则一直向左移动
        while ($L < $R && $arr[$R] >= $target) {
            $R--;
        }
        //将arr[R]填到arr[L]的空位中 
        // 此时 arr[R] 空出 为下一次从左向右查找空出位置
        $arr[$L] = $arr[$R];   

        //从左向右查找大于target的数 如果不满足条件 则一直向右移动
        while ($L < $R && $arr[$L] <= $target) {
            $L++;
        }
        //将arr[L]填到arr[R]中
        $arr[$R] = $arr[$L];   
    }
    $arr[$R] = $target;  //此时左右指针重合,将目标数填入中间这个坑中
    return $R;
}
 
function quitSort(&$arr, $L, $R){
    // 对数组进行第一次操作,
    // 选取一个数,并根据规则把他放在合适的位置,
    // 根据这个位置把整个数组分割成两个数组,然后对每一个数组重复此操作
    // 直到每一个数组只包含一个元素
    
    $pos = findPos($arr, $L, $R);

    // 左边的数组
    if ($L<$pos-1){
        quitSort($arr,$L,$pos-1);
    }

    // 右边的数组
    if ($pos+1 < $R){
        quitSort($arr,$pos+1,$R);
    }
}


$arr = [12,56,98,32,16,34,2,9,1];
$len = count($arr);

quitSort($arr,0,$len-1);

echo(implode(",",$arr)).PHP_EOL;

点赞

发表评论

邮箱地址不会被公开。 必填项已用*标注