PHP实现 快速排序

<?php
/**
 * Created by PhpStorm.
 * User: baimayou
 * Date: 19-3-23
 * Time: 下午9:44
 * 快速排序
 * 思想:如果要排序数组中下标从 p 到 r 之间的一组数据,我们选择 p 到 r 之间的任意一个数据作为 pivot(分区点)。
 *      我们遍历 p 到 r 之间的数据,将小于 pivot 的放到左边,将大于 pivot 的放到右边,将 pivot 放到中间。
 *      经过这一步骤之后,数组 p 到 r 之间的数据就被分成了三个部分,当数组中待排序的元素个数变为1时就不需要进行排序
 *      前面 p 到 q-1 之间都是小于 pivot 的,中间是 pivot,后面的 q+1 到 r 之间是大于 pivot 的。
 * 解法:选取数组字一个元素为枢纽,从两端交替向中间扫描,当low和height碰头时结束扫描。
 *      其实从后向前寻找第一个小于point的值然后与point交换位置,然后从前向后一次寻找第一个比point大的值与point交换位置
 */
function quick(&$arr,$m){
    quick_sort($arr,0,$m-1);
}
function quick_sort(&$arr,$low,$height){
    if($low < $height){
        $point = partition($arr,$low,$height);
        quick_sort($arr,$low,$point-1);
        quick_sort($arr,$point+1,$height);
    }

}
function partition(&$arr,$low,$height){
    $point = $arr[$low];
    while($low < $height){
        while($low < $height && $arr[$height] >= $point){
            $height--;
        }
        temp($arr,$low,$height);
        while($low < $height && $arr[$low] <= $point){
            $low++;
        }
        temp($arr,$low,$height);
    }
    return $low;
}
function temp(&$arr,$i,$j){
    $temp = $arr[$i];
    $arr[$i] = $arr[$j];
    $arr[$j] = $temp;
}
$str = '7485123';
$arr = str_split($str);
$num = count($arr);
$arr = quick($arr,$num);
var_dump($arr);

猜你喜欢

转载自blog.csdn.net/weixin_41895535/article/details/89452630