[关闭]
@Chiang 2020-02-13T11:51:14.000000Z 字数 1387 阅读 460

冒泡排序

算法


思路分析

想象一个大水池里有N多还未排好的序列的氢气球,较大的先冒出来,然后依次是较小的往上冒。即,每次比较相邻的两个数,小的在前大的在后,否则进行位置互换。

动图演示

冒泡排序

代码实现

  1. /**
  2. * 交换方法
  3. * @param array $arr 目标数组
  4. * @param $a 索引a
  5. * @param $b 索引b
  6. * @param bool $flag 交换标志
  7. * @return bool
  8. */
  9. function swap(array &$arr,$a,$b,$flag = false){
  10. // 遍历i后面的元素,只要该元素小于当前元素,就把较小的往前冒泡
  11. if($arr[$a] > $arr[$b]){
  12. $temp = $arr[$a];
  13. $arr[$a] = $arr[$b];
  14. $arr[$b] = $temp;
  15. $flag = true;
  16. }
  17. return $flag;
  18. }
  19. /**
  20. * 第一种写法
  21. * @param $arr 所要排序的数组
  22. * @return mixed 返回的数组
  23. */
  24. function bubbleSort($arr) {
  25. $len = count($arr);
  26. if ($len <= 1) {return $arr;}
  27. //该层循环控制 需要冒泡的轮数
  28. for ($i = 0; $i < $len-1; $i++) {
  29. //该层循环用来控制每轮 冒出一个数 需要比较的次数
  30. for ($j = $i + 1; $j < $len; $j++) {
  31. // 或者 $this->swap($arr,$j,$j+1);
  32. $this->swap($arr,$i,$j);
  33. }
  34. }
  35. return $arr;
  36. }
  37. //第二种写法
  38. public function BubbleSort2($arr){
  39. $len = count($arr);
  40. if ($len <= 1) {return $arr;}
  41. for ($i = 0;$i < $len-1;$i++){
  42. //TODO 本趟排序开始前,交换标志应为假
  43. $flag = false;
  44. for ($j = 0;$j <= $len-2;$j++){
  45. $flag = $this->swap($arr,$j,$j+1,$flag);
  46. }
  47. if(!$flag) return $arr;
  48. }
  49. return $arr;
  50. }
  51. //第三种写法
  52. function BubbleSort3(array &$arr){
  53. $len = count($arr);
  54. if ($len <= 1) {return $arr;}
  55. for($i = 0;$i < $len-1;$i++){
  56. //从后往前逐层上浮小的元素 $j >= 0
  57. for($j = $len - 2;$j >= $i ;$j --){
  58. $this->swap($arr,$j,$j+1);
  59. }
  60. }
  61. return $arr;
  62. }
  63. //第四种写法
  64. function bubbleSort4($arr)
  65. {
  66. $len = count($arr);
  67. if ($len <= 1) {return $arr;}
  68. for($i = 0;$i < $len-1;$i++) {
  69. for($j = 0;$j < $len-$i-1;$j++) {
  70. $this->swap($arr,$j,$j+1);
  71. }
  72. }
  73. return $arr;
  74. }

小结

  • 时间复杂度:O(n^2)
  • 补充:可使用PHP内置函数 sort()或rsort().
  • 上述函数对索引数组按照键值进行排序,为 array 中的单元赋予新的键名,这将删除原有的键名而不仅是重新排序。如果成功则返回 TRUE,否则返回 FALSE

参考资料:
PHP饭米粒
PHP常见排序算法学习
常用的排序算法系列
十大经典排序算法

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注