快速排序算法分析解析

快速排序算法的时间复杂度和各次标准数据元素的值关系很大。如果每次选取的标准元素都能均分两个子数组的长度,这样的快速排序过程是一个完全二叉树结构。(即每个结点都把当前数组分成两个大小相等的数组结点,n个元素数组的根结点的分解次数就构成一棵完全二叉树)。这时分解次数等于完全二叉树的深度log2n;每次快速排序过程无论把数组怎样划分、全部的比较次数都接近于n-1次,所以最好情况下快速排序算法的时间复杂度为O(nlog2n):快速排序算法的最坏情况是数据元素已全部有序,此时数据元素数组的根结点的分需次数构成一棵二叉退化树(即单分支二叉树),一棵二叉退化树的深度是n,所以最坏情况下快速排序算法的时间复杂度为O(n2)。般情况下 ,标准元素值的分布是随机的,数组的分邮大数构成模二又树,这样的二叉树的深度接近于log2n, 所以快速排序算法的平均(或称期望)时间复杂度为O(nlog2n)

function findKey(&$arr, $low, $hight)
{
    $target = $arr[$low];
    while ($low < $hight) {

        while ($low < $hight && $target < $arr[$hight]) {
            $hight--;
        }
        $arr[$low] = $arr[$hight];
        while ($low < $hight && $target > $arr[$low]) {
            $low++;
        }
        $arr[$hight] = $arr[$low];
    }
    $arr[$hight]=$target;
    return $hight;
}
function quickSort(&$arr,$low,$hight){
    $posKey=findKey($arr,$low,$hight);
    if($low<$posKey){
        quickSort($arr,$low,$posKey-1);
    }
    if($posKey<$hight){
        quickSort($arr,$posKey+1,$hight);
    }
}
$arr = [12, 56, 98, 32, 16, 34, 2, 9, 1];

$len = count($arr);
quickSort($arr, 0, $len - 1);
var_dump($arr);die;

 

posted @ 2019-02-17 23:20  friendwrite  阅读(1292)  评论(0编辑  收藏  举报