算法系列:冒泡排序法
一、基本思路
通过两两比较,然后交换双方位置的一种排序方法。
二、示例代码
$arr = array(1,4,2,6,3,8);for($i=0;$i<count($arr)-1;$i++){ for($j=$i+1;$j<count($arr);$j++){ if($arr[$i]>$arr[$j]){ //如果前面的数比后面的大,则进行交换 $temp = $arr[$j]; $arr[$j] = $arr[$i]; $arr[$i] = $temp; } }}//$arr = array(1,2,3,4,6,8)
三、分析说明
1、需要两层循环
2、第一层循环从第一个数开始,截止到倒数第二个数
3、第二层循环从第一个数的后面开始,截止到最后一个数。
4、当前面的数比后面的大时,进行位置互换,互换需要一个临时变量。
四、复杂度分析
1、第一层循环需要执行n-1次,第二层循环也要执行n-1次
2、总执行次数为(n-1)*(n-1) = n^2 - 2n + 1
3、时间复杂度为n^2
数量n 执行次数
2 1
3 4
4 9
5 16
... ...
101 10000
五、备注
冒泡法思路简单,实现简单,对于数据规模比较小的情况下适合使用。
六、双向冒泡(鸡尾酒冒泡)
这是一种左到右,右到左,反复扫描排序模式,整体排序效率略高于单向冒泡,但是实现起来复杂的多。
当待排序数组比较规则时(大部分已排序)效率比单向冒泡高。
//交换函数function swap(&$arr,$i,$j){ $temp = $arr[$i]; $arr[$i] = $arr[$j]; $arr[$j] = $temp; return $arr;}//向右排序(大的往右放)function leftSort(&$arr,$left,$right){ for($i=$left;$i<$right;$i++){ if($arr[$i]>$arr[$i+1]){ swap($arr,$i,$i+1); } } }//向左排序(小的往左放)function rightSort(&$arr,$right,$left){ for($i=$right;$i>$left;$i--){ if($arr[$i-1]>$arr[$i]){ swap($arr,$i-1,$i); } }}function CocktailSort(&$arr,$n){ $left = 0; $right = $n-1; while($left < $right){ leftSort($arr,$left,$right); $right -=1; rightSort($arr,$right,$left); $left +=1; }}$arr = array(1,4,2,6,3,8);$n = count($arr);CocktailSort($arr,$n);//arr = array(1,2,3,4,6,8);
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。