冒泡排序
冒泡排序属于基本的排序算法,面试时候经常会被问到。今天来说点不一样的冒泡。
思想
- 分别比较左右相邻两个元素大小,若右边元素小于左边元素,则交换位置。
基础版
public function msort() { $array = [8,7,5,1,2,3]; $len = count($array); $num = 0; for ($i = 0;$i < $len - 1;$i++){ $num++; for ($j = 0;$j < $len - 1 - $i;$j++){ if ($array[$j] > $array[$j+1]){ $tmp = $array[$j]; $array[$j] = $array[$j+1]; $array[$j+1] = $tmp; } } //echo $num; //print_r($array); } //echo '<pre>'; //echo $num; print_r($array); }
将调试打印的注释去掉运行下,你会发现:外层循环进行了5次,但是在第3次完成后,数组就是有序的了。后面几次循环是非必要的循环。
是不眼前一亮?我们可以在数组已经有序的情况下,及时终止掉循环。
小场面,直接上代码。
进化版
public function mSort() { $array = [8,7,5,1,2,3]; $len = count($array); $num = 0; for ($i = 0;$i < $len - 1;$i++){ $num++; //是否有序标识,默认为是 $sortFlag = true; for ($j = 0;$j < $len - 1 - $i;$j++){ if ($array[$j] > $array[$j+1]){ $tmp = $array[$j]; $array[$j] = $array[$j+1]; $array[$j+1] = $tmp; //存在位置交换,非有序 $sortFlag = false; } } echo $num; print_r($array); if ($sortFlag){ break; } } echo '<pre>'; echo $num; print_r($array); }
当数组有序时候,直接跳出最外层循环,运行代码可以看出,外层循环进行了4次,对咱们的优化迈出了一小步。
既然外层循环可以减少循环次数,内层是不也一样呢?
究极版本
public function mSort() { $array = [3,4,2,1,5,6,7,8]; $len = count($array) - 1; for ($i = 0;$i < count($array) - 1;$i++){ //是否有序标识,默认为是 $sortFlag = true; //内层循环停止节点 $nLen = $len; $num = 0; for ($j = 0;$j < $nLen;$j++){ //$num++; if ($array[$j] > $array[$j+1]){ $tmp = $array[$j]; $array[$j] = $array[$j+1]; $array[$j+1] = $tmp; //存在位置交换,非有序 $sortFlag = false; $len = $j; } } //echo $num; if ($sortFlag){ break; } } print_r($array); }
算法在一定基础上是依据数据的特殊性来不断尝试变更从而达到优化的效果的,使用示例来一步步验证,加油吧,骚年。
好文章要分享: