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);
}

Categories: ,

Updated: