PHP中的快速排序法
快速排序法被我称为填坑挖萝卜法。。假设前面有一行萝卜。。 1,拾起第一个萝卜A(或者随即挑选一个萝卜)作为“尺子”。 2,从后往前找,找到第一个比它大的萝卜,然后拔起来,放在A原来的位置,将A放在新挖的坑里。 3,从前往后找,找到第一个比它小的萝卜,然后拔起来,放在A的新位置,将A再放入新挖的坑里。 4,重复23步骤,一直挖到A的前面的萝卜都比他小,后面的萝卜都比它大。 5,将A前面的萝卜,和A后面的萝卜分开看,重复1234步骤。 6,重复执行123456,直到没有萝卜可以换。也就是从前到后一个比一个大,随便拿出一个从后面也找不到比它小的,前面找不到比它大的。(萝卜这么折腾估计会全部死掉) 代码:
/**
* 快速排序法
* @param array $arr
* @param unknown $key
* @return multitype:|Ambigous <multitype:, unknown>
*/
function quickSort(array $arr,$key){
//校验数组,当数组仅有一个的时候直接返回(对递归很有用)
$count = count($arr)-1;
if(!is_array($arr)||$count<1){
return $arr;
}
//将基准脚码与左边界定位在一起
$index =$l= 0;
$r = $count;
//只有当右边界大于或者等于左边界时才执行
while ($r>=$l){
//从后往前寻找比基准值小的然后互换位置,将基准值脚码调节至互换后的位置
for ($r;$r>=0;$r--){
if($arr[$r][$key]<$arr[$index][$key]){
$t = $arr[$r];
$arr[$r]=$arr[$index];
$arr[$index] = $t;
$index = $r;
break;
}
}
//从前向后寻找比基准值大的,将基准值调节至互换后的位置
for($l;$l<=$r;$l++){
if($arr[$l][$key]>$arr[$index][$key]){
$t = $arr[$l];
$arr[$l]=$arr[$index];
$arr[$index]=$t;
$index=$l;
break;
}
}
}
//递归左右分割后的数组,基准值不参与计算
$arrayL = quickSort(array_slice($arr,0,$index), $key);
$arrayR = quickSort(array_slice($arr,$index+1), $key);
return array_merge($arrayL,array($arr[$index]),$arrayR);
}