第一种实现,从数组一头便利,平均时间复杂度nlog(n),极端情况下,数组为倒序,此时时间复杂度退化成n2。
- function quick_sort(&$arr, $lower, $upper)
- {
- if($lower >= $upper)
- {
- return;
- }
- $key = $arr[$lower];
- $m = $lower;
- for($i = $lower + 1; $i <= $upper; $i++)
- {
- if($arr[$i] < $key)
- {
- $m++;
- $tmp = $arr[$m];
- $arr[$m] = $arr[$i];
- $arr[$i] = $tmp;
- }
- }
- $tmp = $arr[$m];
- $arr[$m] = $arr[$lower];
- $arr[$lower] = $tmp;
- quick_sort($arr, $lower, $m - 1);
- quick_sort($arr, $m + 1, $upper);
- }
第二种方案,从数组两头开始遍历,时间复杂度在最坏情况下,依然是n2
- function quick_sort(&$arr, $lower, $upper)
- {
- if($lower >= $upper)
- {
- return;
- }
- $key = $arr[$lower];
- $i = $lower;
- $j = $upper;
- while($i < $j)
- {
- while($arr[++$i] < $key && $i < $j);
- while($arr[--$j] > $key);
- if($i > $j)
- {
- break;
- }
- $tmp = $arr[$j];
- $arr[$j] = $arr[$i];
- $arr[$i] = $tmp;
- }
- $tmp = $arr[$j];
- $arr[$j] = $arr[$lower];
- $arr[$lower] = $tmp;
- quick_sort($arr, $lower, $j - 1);
- quick_sort($arr, $j + 1, $upper);
- }