@Chiang
2020-02-13T03:51:14.000000Z
字数 1387
阅读 664
算法
想象一个大水池里有N多还未排好的序列的氢气球,较大的先冒出来,然后依次是较小的往上冒。即,每次比较相邻的两个数,小的在前大的在后,否则进行位置互换。
/*** 交换方法* @param array $arr 目标数组* @param $a 索引a* @param $b 索引b* @param bool $flag 交换标志* @return bool*/function swap(array &$arr,$a,$b,$flag = false){// 遍历i后面的元素,只要该元素小于当前元素,就把较小的往前冒泡if($arr[$a] > $arr[$b]){$temp = $arr[$a];$arr[$a] = $arr[$b];$arr[$b] = $temp;$flag = true;}return $flag;}/*** 第一种写法* @param $arr 所要排序的数组* @return mixed 返回的数组*/function bubbleSort($arr) {$len = count($arr);if ($len <= 1) {return $arr;}//该层循环控制 需要冒泡的轮数for ($i = 0; $i < $len-1; $i++) {//该层循环用来控制每轮 冒出一个数 需要比较的次数for ($j = $i + 1; $j < $len; $j++) {// 或者 $this->swap($arr,$j,$j+1);$this->swap($arr,$i,$j);}}return $arr;}//第二种写法public function BubbleSort2($arr){$len = count($arr);if ($len <= 1) {return $arr;}for ($i = 0;$i < $len-1;$i++){//TODO 本趟排序开始前,交换标志应为假$flag = false;for ($j = 0;$j <= $len-2;$j++){$flag = $this->swap($arr,$j,$j+1,$flag);}if(!$flag) return $arr;}return $arr;}//第三种写法function BubbleSort3(array &$arr){$len = count($arr);if ($len <= 1) {return $arr;}for($i = 0;$i < $len-1;$i++){//从后往前逐层上浮小的元素 $j >= 0for($j = $len - 2;$j >= $i ;$j --){$this->swap($arr,$j,$j+1);}}return $arr;}//第四种写法function bubbleSort4($arr){$len = count($arr);if ($len <= 1) {return $arr;}for($i = 0;$i < $len-1;$i++) {for($j = 0;$j < $len-$i-1;$j++) {$this->swap($arr,$j,$j+1);}}return $arr;}
- 时间复杂度:O(n^2)
- 补充:可使用PHP内置函数 sort()或rsort().
- 上述函数对索引数组按照键值进行排序,为 array 中的单元赋予新的键名,这将删除原有的键名而不仅是重新排序。如果成功则返回 TRUE,否则返回 FALSE
参考资料:
PHP饭米粒
PHP常见排序算法学习
常用的排序算法系列
十大经典排序算法
