算法基础-快速排序-PHP实现

算法原理

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

PHP实现快速排序

递归实现

<?php
function quickSort($arr){
    if(count($arr)>1){
        $k=$arr[0];
        $x=array();
        $y=array();
        $count=count($arr);
        for($i=1;$i<$count;$i++){
            if($arr[$i]<=$k){
                $x[]=$arr[$i];
            }else{
                $y[]=$arr[$i];
            }
        }
        $x=quickSort($x);
        $y=quickSort($y);
        return array_merge($x,array($k),$y);
    }else{
        return $arr;
    }
}

$arr = [15, 33, 6, 43, 666, 4, 28, 39, 99, 2];

$res = quickSort($arr);
print_r($res);

非递归实现

function quickSortByStack($arr)
{
    $index_arr[0] = ['left' => 0, 'right' => count($arr) - 1];   //该数组保存需要排序的子数组边界
    $i = 0; // 记录当前排序了几次子数组
    $n = 1; // 当前还有几个子数组需要排序
    while ($i < $n) {        // 判断还有未排序子数组存在
        $left = $index_arr[$i]['left'];    // 数组左边界下标
        $right = $index_arr[$i]['right'];  // 数组右边界下标

        $middleKey = $left;    // 要对比值的下标,一轮对比交换下来,左边的值都比它小,右边的值都比它大
        $flag = false;         // 通过此标记决定是从左往右比还是从右往左比
        while ($left <= $right) {
            // 从右往左对比,直到右边的值比对比值小,则交换位置
            if ($flag == false) {
                if ($arr[$right] < $arr[$middleKey]) {
                    $temp = $arr[$middleKey];
                    $arr[$middleKey] = $arr[$right];
                    $arr[$right] = $temp;
                    $middleKey = $right; // 对比值最新的下标
                    $flag = true;
                }
                $right--; // 对比完一次则右边下标减一
            }
            // 从左往右对比,直到左边的值比对比值大,则交换位置
            if ($flag) {
                if ($arr[$left] > $arr[$middleKey]) {
                    $t = $arr[$middleKey];
                    $arr[$middleKey] = $arr[$left];
                    $arr[$left] = $t;
                    $middleKey = $left; // 对比值最新的下标
                    $flag = false;
                }
                $left++; // 对比完一次则左边下标加一
            }
        }
        //保存子数组的边界值
        if ($index_arr[$i]['left'] < $middleKey - 1) {
            $index_arr[$n] = ['left' => $index_arr[$i]['left'], 'right' => $middleKey - 1];
            $n++;
        }
        if ($index_arr[$i]['right'] > $middleKey + 1) {
            $index_arr[$n] = ['left' => $middleKey + 1, 'right' => $index_arr[$i]['right']];
            $n++;
        }
        $i++;
    }
    return $arr;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值