浅谈算法——快速排序性能分析

上篇文章介绍了一下基本的冒泡排序,今天介绍一下快速排序。

function QuickSort($_array)
{
    if (count($_array)<=1)  
    {   
        return $_array;
    }   
    $key = $_array[0];
    $left_array = $right_array = array();
    for ($i=1;$i<count($_array);$i++)
    {   
        if ($_array[$i] > $key)
        {   
            $right_array[] = $_array[$i];
        }   
        else 
        {   
            $left_array[] = $_array[$i];
        }   
    }   
    $left_array = QuickSort($left_array);
    $right_array = QuickSort($right_array);
    return array_merge($left_array,array($key),$right_array);
}
/*
  * 生成随机数组
 */
function rand_array($_num)
{
    for($i=0;$i<$_num;$i++)
    {   
        $array[$i] = rand(0,$_num*10);
    }   
    return $array;
}
$rand_array = rand_array(10000);
$start = time();
$result = QuickSort($rand_array);
$end = time();
print_r($result);
echo "快速排序需要的时间" . ($end - $start) . "秒;";
?>

冒泡排序需要好几十秒的时间,但是快速排序只需要1秒钟的时间。

性能分析

快速排序快速排序快速排序快速排序:它同样是冒泡排序的改进,它通过一次交换能消除多个逆序,这样可以减少逆序时所消耗的扫描和数据交换次数。在最优情况下,它的排序时间复杂度为O(nlog2n)。 即每次划分序列时,能均匀分成两个子串。但最差情况下它的时间复杂度将是O(n^2)。即每次划分子串时,一串为空,另一串为m-1(程序中的100K正 序和逆序就正是这样,如果程序中采用每次取序列中部数据作为划分点,那将在正序和逆时达到最优)。从100K中正序的结果上看“快速排序”会比“冒泡排 序”更慢,这主要是“冒泡排序”中采用了提前结束排序的方法。有的书上这解释“快速排序”,在理论上讲,如果每次能均匀划分序列,它将是最快的排序算法, 因此称它作快速排序。虽然很难均匀划分序列,但就平均性能而言,它仍是基于关键字比较的内部排序算法中速度最快者。  

参考:http://blog.csdn.net/v_JULY_v/article/details/6211155

原文地址:https://www.cnblogs.com/liqiu/p/2914229.html