快排其实就是一种分而治之的体现。
1、选择一个基准值,一般就是第一个元素。
2、比它小的放左边一个区中,比它大或等于的放右边一个区中。比如 [3, 2, 4, 1],第一轮比完,结果是 : [2 1] 【3】 [4]
3、按上面方式递归执行各个区块做比较, [2, 1] 区,[4] 区, [2, 1] =》 [1, 2] ,[4] 只有一个元素,不用比较了。
看下面的图,很形象了:
接下来用php代码实现一下:
public function quickSort($arr = [3, 2, 4, 1]) {
$len = count($arr);
if ($len < 2) { // 只有一个元素的区就不用比较了
return $arr;
}
// 选择一个基准值,一般选第一个
$base = $arr[0];
// 小于基准值的元素
$left = [];
// 大于等于基准值的元素
$right = [];
// 挑出基准值左边区 和 右边区
for ($i = 1; $i < $len; $i++) {
if ($arr[$i] < $base) {
$left[] = $arr[$i];
} else {
$right[] = $arr[$i];
}
}
// 递归调用
$left = $this->quickSort($left);
$right = $this->quickSort($right);
return array_merge($left, [$base], $right);
}