冒泡排序
<?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;