PHP版快速排序实现,递归和非递归版。
1.非递归版
function quickSort(&$nums) {
$low = 0;
$high = count($nums) - 1;
if ($low < $high) {
$stack = new SplStack();
$stack->push($high);
$stack->push($low);
while(!$stack->isEmpty()) {
$left = $stack->pop();
$right = $stack->pop();
$pivot = partition($nums, $left, $right);
if ($left < $pivot - 1) {
$stack->push($pivot - 1);
$stack->push($left);
}
if ($right > $pivot + 1) {
$stack->push($right);
$stack->push($pivot + 1);
}
}
}
}
function partition(&$nums, $low, $high) {
$pivotKey = $nums[$low];
while ($low < $high) {
# code...
while ($low < $high && $nums[$high] > $pivotKey) {
# code...
$high--;
}
list($nums[$low], $nums[$high]) = [$nums[$high], $nums[$low]];
while ($low < $high && $nums[$low] < $pivotKey) {
# code...
$low++;
}
list($nums[$low], $nums[$high]) = [$nums[$high], $nums[$low]];
}
return $low;
}
$nums = [4, 19, 40, 3, 18];
quickSort($nums);
var_dump($nums);
2.递归实现
function quickSort(&$nums) {
qSort($nums, 0, count($nums) - 1);
}
function qSort(&$nums, $low, $high) {
if ($low < $high) {
$pivot = partition($nums, $low, $high);
qSort($nums, $low, $pivot - 1);
qSort($nums, $pivot + 1, $high);
}
}
function partition(&$nums, $low, $high) {
$pivotKey = $nums[$high];
while($low < $high) {
while($low < $high && $nums[$low] < $pivotKey) {
$low++;
}
list($nums[$low], $nums[$high]) = [$nums[$high], $nums[$low]];
while($low < $high && $nums[$high] > $pivotKey) {
$high--;
}
list($nums[$low], $nums[$high]) = [$nums[$high], $nums[$low]];
}
return $high;
}
$nums = [4, 19, 40, 3, 18];
quickSort($nums);
var_dump($nums);