function quick_sort(&$arr) {
_quick_sort($arr, 0, count($arr) - 1);
}
function _quick_sort(&$arr, $start, $end) {
if ($start >= $end) {
return;
}
#$middle = partition($arr, $start, $end);
#$middle = partition2($arr, $start, $end);
$middle = partition3($arr, $start, $end);
_quick_sort($arr, $start, $middle - 1);
_quick_sort($arr, $middle + 1, $end);
}
function partition(&$arr, $start, $end) {
$tmp = $arr[$start];
while($start < $end) {
while($start < $end && $arr[$end] >= $tmp) {
$end--;
}
swap($arr, $start, $end);
while($start < $end && $arr[$start] <= $tmp) {
$start++;
}
swap($arr, $start, $end);
}
return $start;
}
function partition2(&$arr, $start, $end) {
$tmp = $arr[$end];
while($start < $end) {
while($start < $end && $arr[$start] <= $tmp) {
$start++;
}
swap($arr, $start, $end);
while($start < $end && $arr[$end] >= $tmp) {
$end--;
}
swap($arr, $start, $end);
}
return $start;
}
function partition3(&$arr, $start, $end) {
$middle = ceil(($start + $end)/2);
echo $middle;
while($start < $end) {
while($start < $end && $arr[$start] <= $arr[$middle]) {
$start++;
}
while($start < $end && $arr[$end] >= $arr[$middle]) {
$end--;
}
swap($arr, $start, $end);
}
if ($start != $middle) {
swap($arr, $start , $middle);
}
return $start;
}
function swap(&$arr, $i, $j) {
$tmp = $arr[$i];
$arr[$i] = $arr[$j];
$arr[$j] = $tmp;
}
$arr = [7,1,8,3,8,5,0];
#$arr = [8,8,5,7];
#echo partition3($arr, 0, count($arr) -1);
quick_sort($arr);
print_r($arr);