快速排序


快速排序(Quick Sort)

快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小, 则可分别对这两部分记录继续进行排序,以达到整个序列有序。

算法描述

快速排序使用分治法来把一个串分为两个子串。具体算法描述如下:

动图演示

  • 从数列中挑出一个元素,称为“基准”;
  • 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面。 在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区操作;
  • 递归地把小于基准值元素的子数列和大于基准值元素的子数列排序。

代码实现

$numbers = [20, 40, 60, 80, 30, 70, 90, 10, 50, 0, 5];

function quickSort(&$arr, $start, $end)
{
    if ($start > $end) {
        return;
    }
    $key = $arr[$start];
    $left = $start;
    $right = $end;
    while ($left < $right) {
        while ($left < $right && $arr[$right] >= $key) {
            $right--;
        }
        while ($left < $right && $arr[$left] <= $key) {
            $left++;
        }
        if ($left < $right) {
            $tmp = $arr[$left];
            $arr[$left] = $arr[$right];
            $arr[$right] = $tmp;
        }
    }
    $arr[$start] = $arr[$left];
    $arr[$left] = $key;
    quickSort($arr, $start, $right - 1);
    quickSort($arr, $right + 1, $end);
}

quickSort($numbers, 0, 10);
var_dump($numbers);