算法2: 快速排序

快速排序思路: 将第一个数字作为基准数字,从最右端开始查找(要从右边开始查起哦,因为基准数是最左位的).找出小于它的数字,然后再从左端对比.找大于它的数字.然后将俩个数字进行互换.

就这样一直互换.直到最左与最右走到同一个位置上时,再将这个位置的数字与基准数做对比和互换.这样就形成了基准数的左边全是小于的,右边都是大于的.

然后再将左边的数据,按照上面的流程进行互换.然后右边的数据, 最后再进行组合

$arr = array(6, 1 ,2 , 7, 9, 3, 4, 5,10 ,8);
//$arr = array(6,43,45,33,60,50,40);


function quickSort($arr) {
    if(count($arr) <= 1){
        return $arr;
    }
    //拿第一个数字做中间值
    $centre = $arr[0];

    $l = 1;
    $r = count($arr)-1;
    
    while($l < $r && $l != $r ) {
        #从右边向左边移动,对比.如果遇到比中间值小的就跳出
        while($arr[$r] > $centre && $l < $r) {
            $r--;
        }
        #从左边向右边移动,对比.如果遇到比中间值大的就跳出
        while($arr[$l] < $centre && $l < $r) {
            $l++;
        }
        #如果左边遇到了比中间值大的数字 并且 右边遇到了比中间值小的数  则进行互换
        if($l < $r ) {
            $t = $arr[$l];
            $arr[$l] = $arr[$r];
            $arr[$r] = $t;
        }
    }
    #将左右俩边最终走到一起的值与中间值做对比,并互换位置
    if($arr[$l] < $centre) {
        $tmp1 = $arr[$l];
        $arr[$l] = $centre;
        $arr[0] = $tmp1;
    } else{
        $l--;
    }

    $left_arr = quickSort(array_slice($arr, 0 , $l));
    $right_arr = quickSort(array_slice($arr, $l+1));

    return array_merge($left_arr, array($arr[$l]),  $right_arr);
}

var_dump(quickSort($arr));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值