zoukankan      html  css  js  c++  java
  • 浅谈算法——快速排序性能分析

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

    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

  • 相关阅读:
    Pig与Hive的区别
    Hadoop MapReduceV2(Yarn) 框架简介
    Spark技术内幕:Client,Master和Worker 通信源码解析
    Spark技术内幕:Stage划分及提交源码分析
    无责任比较thrift vs protocol buffers
    理解hadoop的Map-Reduce数据流(data flow)
    hadoop-2.5安装与配置
    linux下查看本地程序占用的端口
    MFC安装与部署(程序打包)
    关系数据库设计中数据字典设计例子
  • 原文地址:https://www.cnblogs.com/liqiu/p/2914229.html
Copyright © 2011-2022 走看看