• PHP算法学习之“简单的交换排序”,“冒泡排序”以及“改进后的冒泡排序”


     1 <?php
     2     class Sort{
     3         /**
     4          * 简单的交换排序
     5          * 冒泡排序初级版
     6          * 这个不算是标准的冒泡排序算法,因为不满足“两两比较相邻记录”的冒泡排序思想,她更应该是最最简单的交换排序而已
     7          * 思路:让每一个关键字和她后面的“每一个”关键字比较,如果大则交换
     8          * 缺点:效率很低
     9          */
    10         public function bubbleSort1(&$arr){
    11             $len=count($arr);
    12             for ($i=0;$i<$len;$i++) {
    13                 for ($j=$i+1;$j<$len;$j++){
    14                     if ($arr[$i]>$arr[$j]) {///这里让每一个关键字和她后面的“每一个”关键字都进行比较
    15                         $this->swap(&$arr[$i],&$arr[$j]);    
    16                     }
    17                 }
    18             }
    19         }
    20         /**
    21          * 正宗的冒泡排序算法
    22          * 思路:通过“两两比较相邻记录”,从而将最小的值排到最顶端
    23          */
    24         public function bubbleSort2(&$arr){
    25             $len=count($arr);
    26             for ($i=0;$i<$len;$i++){
    27                 for($j=$len-1;$j>$i;$j--) {//$j是从后往前循环
    28                     if($arr[$j]<$arr[$j-1]) {//注意:这里是“两两比较相邻记录”,以bubbleSort1不同
    29                         $this->swap(&$arr[$j],&$arr[$j-1]);//这里使用“引用”操作符
    30                     }
    31                 }
    32             }
    33         }
    34         /**
    35          * 冒泡排序算法的改进
    36          * 如果要排序的数组是:[2,1,3,4,5,6,7,8,9]的话,其实只需要将1和2进行比较交换即可,后面的循环中的第二个for循环无需执行,但是如果使用bubbleSort2的话
    37          * 照样会将$i=2到9及后面的for循环都执行一遍,这些比较明显是多余的
    38          * 改进思路:在i变量的for循环中,增加了对flag是否为true的判断
    39          */
    40         public function bubbleSort3(&$arr){
    41             $len=count($arr);
    42             $flag=true;
    43             for ($i=0;$i<$len && $flag;$i++){//如果之前的一次循环判断中,都没有进行数据交换,则表明目前的数据已经是有序的了,从而跳出循环
    44                 $flag=false;
    45                 for($j=$len-1;$j>$i;$j--) {//$j是从后往前循环
    46                     if($arr[$j]<$arr[$j-1]) {//注意:这里是“两两比较相邻记录”,以bubbleSort1不同
    47                         $this->swap(&$arr[$j],&$arr[$j-1]);//这里使用“引用”操作符
    48                         $flag=true; //如果有数据交换,则将$flag设为true
    49                     }
    50                 }
    51             }
    52         }
    53         /**
    54          * 将$a和$b两个值进行位置交换
    55          */
    56         public function swap($a,$b) {
    57             $temp=$a;
    58             $a=$b;
    59             $b=$temp;
    60         }
    61     }
    62     $arr=array(4,6,1,2,9,8,7,3,5);
    63     $test=new Sort();
    64 //    $test->bubbleSort1($arr);//简单的交换排序
    65 //    $test->bubbleSort2($arr);//冒泡排序
    66     $test->bubbleSort3($arr);//改进后的冒泡排序
    67 ?>

          分析一下它的时间复杂度。

      当最好的情况,也就是要排序的表本身就是有序的,那么我们比较次数,根据最后改进的代码,可以推断出就是n‐1次的比较,没有数据交换,时间复杂度为O(n)。

      当最坏的情况,即待排序表是逆序的情况,此时需要比较次,并作等数量级的记录移动。因此,总的时间复杂度为O(n^2)。

  • 相关阅读:
    用vue前后端分离项目开发记录
    使用 JavaScript 将网站后台的数据变化实时更新到前端
    怎么使用 JavaScript 将网站后台的数据变化实时更新到前端
    修改el-table滚动条样式
    修改浏览器滚动条样式
    查找和替换img src
    cookie添加删除修改
    如何处理CSS3属性前缀
    PostCSS深入学习: PostCSS和Sass、Stylus或LESS一起使用
    在 CSS 预编译器之后:PostCSS
  • 原文地址:https://www.cnblogs.com/hongfei/p/2581583.html
Copyright © 2020-2023  润新知