PHP算法之快速排序

快速排序: 效率比较高, 使用空间换时间(递归)

原理: 从一个数组中,随机取出一个元素: 以该元素为基准,将数组中剩余的其他元素挨个的与当前元素进行比较: 比元素小的存放到一个数组, 比元素大的也存放到一个数组. 当所有的元素都比较完之后: 一定会确定中间元素(取出的元素)的位置.

两边的数组依然需要排序: 利用上述解决问题的方式解决子问题(递归点),直到数组元素个数为1, 再返回(递归出口), 返回的结果与上述的结果进行合并.

代码实现

/**
 * 快速排序
 * @param array $arr 待排序的数组
 * @return array 已经排序好的数组
 */
function quick_sort($arr) {
    // 求出数组长度
    $len = count($arr);

    // 递归出口判断
    if ($len <= 1) return $arr;

    // 取出第一个元素
    $middle = $arr[0];

    // 剩余元素与第一个元素进行比较
    $left = $right = array();
    for ($i = 1;$i < $len;$i++) {
        // 比较:小的放左边,大的放右边
        if($arr[$i] < $middle){
            $left[] = $arr[$i];
        }else{
            $right[] = $arr[$i];
        }
    }

    // $left和$right都是未排序的数组
    $left = empty($left) ? $left : quick_sort($left); // 等待:left排好序
    $right = empty($right) ? $right : quick_sort($right);

    // 合并数组: 返回
    return array_merge($left,array($middle),$right);
}

// 定义要排序的数组
$arr = array(3,1,6,9,2,1);

// 调用函数
print_r(quick_sort($arr)); // Array ( [0] => 1 [1] => 1 [2] => 2 [3] => 3 [4] => 6 [5] => 9 )
原文地址:https://www.cnblogs.com/chenjiacheng/p/6522305.html