PHP 算法之快速排序

答案

  • 从数列中挑出一个元素,称为“基准”(pivot),通常选择第一个或最后一个元素。
  • 扫描数列,以基准元素为比较对象,把数列分成两个区,小于基准元素的移动到基准元素前面,大的移到后面,相等的前后都可以。分区完成之后,基准元素就处于数列的中间位置。
  • 再用同样的方法,递归地排序划分的两个区。

在分区过程中,为了不使用额外的空间,左右同时扫描基准之外的元素,在得到一个左边大于基准,右边小于基准的时候,把他们两个进行交换。

  1. function quickSort(&$arr, $leftIndex, $rightIndex)
  2. {
  3. if ($leftIndex < $rightIndex) {
  4. $index = partition($arr, $leftIndex, $rightIndex);
  5. quickSort($arr, $leftIndex, $index - 1);
  6. quickSort($arr, $index, $rightIndex);
  7. }
  8. }
  9. function partition(&$arr, $leftIndex, $rightIndex)
  10. {
  11. $pivot = $arr[($leftIndex + $rightIndex) / 2];
  12. while ($leftIndex <= $rightIndex) {
  13. while ($arr[$leftIndex] < $pivot) {
  14. $leftIndex++;
  15. }
  16. while ($arr[$rightIndex] > $pivot) {
  17. $rightIndex--;
  18. }
  19. if ($leftIndex <= $rightIndex) {
  20. list($arr[$leftIndex], $arr[$rightIndex]) = [$arr[$rightIndex], $arr[$leftIndex]];
  21. $leftIndex++;
  22. $rightIndex--;
  23. }
  24. }
  25. return $leftIndex;
  26. }

时间复杂度:

  • 最坏:O(n2)
  • 平均:O(n lg n)
  • 最好:O(n)