// 将第一个元素和中间的元素(参考元素)交换位置
// 遍历整个数组,将值比参考元素小的依次和参考元素后面的元素交换位置
// 遍历结束后将参考元素和最后一个比他小的元素交换位置,使得比参考元素小的都在他左边
// 对参考元素左边的数组进行同样的操作
// 对参考元素右边的数组进行同样的操作
// 如果数组的元素少于2个,则直接返回
public function normal_rank($list, $left, $right)
{
if ($left >= $right)
{
return $list;
}
$list = $this -> swap_item($list, $left, ($left + $right) / 2);
$last = $left;
for($i = $left + 1; $i <= $right; $i++)
{
if ($list[$i] < $list[$left])
{
$list = $this -> swap_item($list, ++$last, $i);
}
}
$list = $this -> swap_item($list, $left, $last);
$list = $this -> normal_rank($list, $left, $last - 1);
$list = $this -> normal_rank($list, $last + 1, $right);
return $list;
}
//交换
public function swap_item($list, $i, $j)
{
$temp = $list[$i];
$list[$i] = $list[$j];
$list[$j] = $temp;
return $list;
}
// 测试
public function test()
{
$list = [2, 8 ,10, 3, 30, 25, 20];
$res = $this -> normal_rank($list, 0, count($list) - 1);
var_dump($res);
}