冒泡算法和快速排序算法实现和比较

<?php

//要进行排序的数组
$example = array(7,5,6,9,3,4,2,1,7,10,15,12,2,32,1,2,13,123,2,2,546,53,4,2,2,43,4,54,3,43,5,345,45,3,3,243,21,44,124,2,4,32432);

/**
* 冒泡算法
* 算法思路是将每个相邻的元素进行比较,然后根据值的大小判断是否进行位置互换
* 算法复杂度O(n^2)
* @param $sort DESC || ASC
*/

function maopao($example,$sort){
$count = count($example);
for($i=0;$i<$count;$i++){
for($a=1;$a<$count;$a++){
$temp = $example[$a];
if($sort == "DESC" && $example[$a] > $example[$a-1]){
//位置互换
$example[$a] = $example[$a-1];
$example[$a-1] = $temp;
}
if($sort == "ASC" && $example[$a] < $example[$a-1]){
//位置互换
$example[$a] = $example[$a-1];
$example[$a-1] = $temp;
}
}
}
return $example;
}

/**
* 快速排序法
* 算法思路是将随意挑选其中一个元素,大于/小于该元素的元素 靠左/右(DESC/ASC)
* 然后再将左右两个元素进行相同规则的递归之后,最后合并数组
* 算法复杂度O(<=n)
*/
function fastSort($example,$sort){
//取第一个元素作为参考元素
$flags = $example[0];
$count = count($example);
$left = array();
$right = array();
for($i = 0;$i<$count;$i++){
if($sort == "DESC"){ //倒序
if($example[$i] > $flags){
$left[] = $example[$i];
}else if($example[$i] < $flags){
$right[] = $example[$i];
}
}

if($sort == "ASC"){ //正序
if($example[$i] < $flags){
$left[] = $example[$i];
}else if($example[$i] > $flags){
$right[] = $example[$i];
}
}
}
if(!empty($left))
$left = fastSort($left,$sort);
if(!empty($right))
$right = fastSort($right,$sort);
//返回合并后的数组
return array_merge($left,array($flags),$right);
}

//设置最大执行时间
set_time_limit(0);
//函数嵌套调用次数设置无限次
ini_set("xdebug.max_nesting_level",0);
$i=0;
while($i < 1000){
$example[] = $i;
$i++;
}

$start = microtime(true);
$ret = fastSort($example,"DESC");
print_r("快速排序法,耗时:");
echo (microtime(true) - $start);

 

$start = microtime(true);
$ret = maopao($example,"DESC");
print_r("冒泡排序法,耗时:");
echo (microtime(true) - $start);

 同服务器下经过1000个数组量进行比较,快速排序法是冒泡法速度的7倍

posted @ 2017-01-13 18:51  飞羽惊鸿  阅读(260)  评论(0编辑  收藏  举报