首页 > IT职业 > IT生活 > 【我就瞎记记,你就瞎看看】小算法-快速排序
定义一个基准数,用于做参照。
定义左右两侧的起始数和终止数,一般是以数组起始值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
[43,46,35],右边数组[85,78]。最终右侧会变成$right_arr=[35,43,46,64,78,85];
$arr=[5,6,11,12,35,43,46,64,78,85];
= $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] 来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/717/viewspace-2798398/ ,如需转载,请注明出处,否则将追究法律责任。