<?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);
PHP实现 快速排序
最新推荐文章于 2022-12-02 16:46:14 发布