快速排序
-
定义一个基准数,用于做参照。
-
定义左右两侧的起始数和终止数,一般是以数组起始值0,以及数组长度-1为开始
-
数组【0】开始,与基准数X进行判断,如果比X ==大==,则停止,保留数组【0】;
比X ==小==,则数组【0】变成数组【1】(即向右移动一位),再与基准数X判断,如此
循环,到符合前面条件停止。
-
数组【长度-1】开始,与基准数X进行判断,如果比X==小==,则停止,保留数组【长度-1】;
比X ==大==,则数组【长度-1】变成数组【长度-2】(即向左移动一位),再与基准数
X判断,如此循环,到符合前面条件停止。
例如:
-
现在有数组
$arr = [12, 6, 5, 35, 64, 78, 11, 85, 43,46];
- 我们取
$arr[0]=12
为基准数$temp
。(这边如果设置基准数是最左边的,则让右侧先开始判断值,如果基准数设置是最右边的数,则让左侧开始先判断) -
定义变量
$i=0; $j=9(数组长度-1);
- 然后从
$arr[$j]
先开始进行判断,如果不符合条件则$j--
;$j
会在$arr[6]=11
位置停下。 -
$arr[$i]
开始进行判断,如果不符合条件则$i--
;$i
会在$arr[3]=35
位置停下。 $arr[3
]与$arr[6]
互换。-
更换完,数组是
$arr = [12, 6, 5, 11, 64, 78, 35, 85, 43,46];
- 更换完以后,右侧的
$j
继续先判断,从$j=6开始往左走,此时$i=3
。 -
$j
此轮一直与$i=3
的位置相遇,当两者相遇的时候,则将相遇位置($i=$j)
的数与基准数$temp=12
进行互换。 -
更换完,数组是
$arr = [11, 6, 5, 12, 64, 78, 35, 85, 43,46];
- 此时,基于
$arr[3]
这个位置,将数组拆分为左右两次数组,进行相同的方式判断(这里会用到递归的方法)。 -
左侧数组为
$left_arr=[11,6,5];
右侧数组为$right_arr=[64,78,35,85,43,46];
- 左侧数组用上述方法进行排列,变成
$left_arr=[5,6,11];
。 -
右侧数组用上述方法进行排列,首先变成
$right_arr=[43,46,35,64,85,78];
-
这时,左侧已经不需要排列了,因为
$temp=11
基准数归位后,右侧没有数组,左侧5<6
- 右侧还要进行排列,$temp=64基准数归位后,左边数组为
[43,46,35]
,右边数组[85,78]
。 -
最终右侧会变成
$right_arr=[35,43,46,64,78,85];
- 最终数组
$arr=[5,6,11,12,35,43,46,64,78,85];
代码:
<?php
//准备数据样本
$arr = [12, 6, 5, 35, 64, 78, 11, 85, 43, 46];
function quickSort($left, $right)
{
//php函数内调用全局变量$arr
global $arr;
if ($left >= $right) {
return;
}
//设置基准数,作为比较用的参数
$temp = $arr[$left];
//$i是左边起的起始数值,$j是右边起的起始数值
$i = $left;
$j = $right;
//只要两个参数不相等,即两者不是指向同一个数组内参数 则继续循环
while ($i != $j) {
//从数组右侧开始,判断是否比基准数小并且($j>$i)确保从右往左且还未与$i相遇
while ($arr[$j] >= $temp && $j > $i) {
$j--;
}
//从数组左侧开始,判断是否比基准数大并且($j>$i)确保从左往右且还未与$j相遇
while ($arr[$i] <= $temp && $i < $j) {
$i++;
}
/**上述两个判断条件停止时,$i,$j都会指向数组内的某个数$arr[$i],$arr[$j]
*并且$arr[$i]是比基准数大的,$arr[$j]是比基准数小的
*两者的值进行互换
*/
if ($i < $j) {
$t = $arr[$i];
$arr[$i] = $arr[$j];
$arr[$j] = $t;
}
}
//当$i,$j两个参数相等时候,则跳出循环,并且将基准数与数组中(当$j=$i时)$arr[$i]内的值进行互换。
$arr[$left] = $arr[$i];
$arr[$i] = $temp;
//利用递归,将$i=$j的数组参数左侧进行判断归位,右侧进行判断归位,最终返回结果。
quickSort($left, $i - 1);
quickSort($i + 1, $right);
return;
}
quickSort(0, count($arr) - 1);
print_r($arr);