zoukankan      html  css  js  c++  java
  • 软件测试开发人员需要掌握的一些基本数据结构算法(php编写)

    一:冒泡排序算法

        冒泡排序(Bubble Sort)算法是一种典型的交换排序算法,通过两两数据交换进行排序。如果有n个数,则要进行n-1趟比较,在第1趟比较中要进行n-1次两两比较,在第j趟比较中要进行n-j次两两比较。

      复杂度分析:冒泡排序需要次交换。

     1 <?php
     2 /**
     3   *冒泡排序算法
     4 **/
     5 
     6 //定义一个数组,并赋值
     7 $arr=array(3,5,8,4,9,6,1,7,2);
     8 
     9 //封装一个方法BubbleSort
    10 function BubbleSort($arr){
    11  
    12     $length=count($arr);//count()函数是计算数组中单元数目或者对象中的属性个数
    13      
    14     if($length<=1){
    15         return $arr;
    16     }
    17      
    18     for($i=0;$i<$length-1;$i++){
    19         for($j=0;$j<$length-1-$i;$j++){
    20             if($arr[$j]>$arr[$j+1])
    21                 $t=$arr[$j];
    22                 $arr[$j]=$arr[$j+1];
    23                 $arr[$j+1]=$t;
    24             }
    25         }
    26     }
    27      
    28      return $arr;
    29 }
    30 
    31 echo '冒泡排序:';
    32 echo implode(',',BubbleSort($arr))."<br/>";

       运行结果如下:

      

      上面是升序排序,如果是倒序的话,将代码第20行>改为<。

    二:快速排序算法

      快速排序(Qucik Sort)又称划分交换排序,快速排序的基本思想是划分、分治,递归。

      在平均状况下,排序个项目要(大O符号)次比较。在最坏状况下则需要次比较,但这种状况并不常见。事实上,快速排序通常明显比其他算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地达成。

     1 <?php
     2 /**
     3 **快速排序算法
     4 **快速排序的基本思想是划分,分治,递归。 
     5 **第一步是划分,将整个数组划分为两个部分,第一部分所有值小于基准值,
     6 **        第二部分所以值大于基准值。基准值的选择随机,一般选择待排数组的第一个元素。划分规则在下方。 
     7 **第二步:分治递归。第一步将数组划分为两部分后,两部分内部还不是有序的,
     8 **       再分别对两部分进行递归快速排序,最终得到一个完整的有序数组
     9 **/
    10 
    11 //定义一个数组,并赋值
    12 $arr=array(3,5,8,4,9,6,1,7,2);
    13 
    14 //快速排序方法
    15 function QSort($arr){
    16     $length=count($arr);//count()函数是计算数组中单元数目或者对象中的属性个数
    17     
    18     if($length<=1){
    19         return $arr;
    20     }
    21     
    22     $pivot=$arr[0];//枢纽(默认拿第一个数组元素作为枢纽)
    23     $left_arr=array();
    24     $right_arr=array();
    25     for($i=1;$i<$length;$i++){//注意$i从1开始,0下标的已被作为枢纽
    26         if($arr[$i]<=$pivot){
    27             $left_arr[]=$arr[$i];
    28         }else{
    29             $right_arr[]=$arr[$i];
    30         }
    31     }
    32     
    33     $left_arr=QSort($left_arr);//递归排序左半部分
    34     $right_arr=QSort($right_arr);//递归排序右半部分
    35     
    36     return array_merge($left_arr,array($pivot),$right_arr);//合并左半部分,枢纽,右半部分
    37 }
    38 
    39 echo '快速排序:';
    40 echo implode(',',QSort($arr))."<br/>";  

       运行结果如下:

      

    三:选择排序算法

      选择排序(Selection Sort)是一种简单直观的排序算法。它的工作原理如下,首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

      选择排序每次交换一对元素,它们当中至少有一个将被移到其最终位置上,因此对n个元素的序列进行排序总共进行至多n-1次交换。在所有的完全依靠交换去移动元素的排序方法中,选择排序属于非常好的一种。最好情况是,已经有序,交换0次;最坏情况是,逆序,交换n-1次。交换次数比冒泡排序较少。

     1 <?php
     2 /**
     3 **选择排序算法
     4 **/
     5 $arr = array(1,0,2,9,3,8,4,7,5,6); 
     6 //用函数封装选择排序法 
     7 function SelectSort($arr){  
     8      //定义一个中间变量  
     9      $t=0;  
    10      
    11     //升序排序  
    12     for($i=0;$i<count($arr)-1;$i++){   
    13         //假设$i就是最小的数  
    14         $minvalue=$arr[$i];   
    15         //记录最小数的下标   
    16         $minkey=$i; 
    17         
    18         for($j=$i+1;$j<count($arr);$j++){     
    19             if($minvalue>$arr[$j]){ //升序排序    
    20                 $minvalue=$arr[$j];     
    21                 $minkey=$j;    
    22             }   
    23         }  
    24         
    25         //最后交换  
    26         $t=$arr[$i];   
    27         $arr[$i]=$arr[$minkey];   
    28         $arr[$minkey]=$t;         
    29     }  
    30     
    31     return $arr;
    32 } 
    33 echo "选择排序:".implode(',',SelectSort($arr));//implode()函数是将一个数组转为字符串    

      运行结果如下:

      

    四:插入排序算法

      插入排序(Insert Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序不适合对于数据量比较大的排序应用。但是,如果需要排序的数据量很小,例如,量级小于千;或者若已知输入元素大致上按照顺序排列,那么插入排序还是一个不错的选择。

      复杂度分析:如果目标是把n个元素的序列升序排列,那么采用插入排序存在最好情况和最坏情况。 最好情况就是,序列已经是升序排列了,在这种情况下,需要进行的比较操作需n-1次即可。 最坏情况就是,序列是降序排列,那么此时需要进行的比较共有2/1n(n-1)次。插入排序的赋值操作是比较操作的次数减去次,(因为n-1次循环中,每一次循环的比较都比赋值多一个,多在最后那一次比较并不带来赋值)。平均来说插入排序算法复杂度为

     1 <?php
     2 $arr=array(1,0,2,9,3,8,4,7,5,6); 
     3 function InsertSort($arr){
     4     $length=count($arr);
     5     if($legth<=1){
     6         return $arr;
     7     }
     8     for($i=0;$i<$length-1;$i++){
     9         $t=$arr[$i];//默认排序好的是第一个 $t为未排序好的第一个数据
    10         for($j=$i-1;$j>=0;$j--){//排序好的的最后一个数据跟未排序好的第一个数据比较
    11             if($t<$arr[$j]){
    12                 $arr[$j+1]=$arr[$j];
    13                 $arr[$j]=$t;
    14             }
    15         }
    16     }
    17     return $arr;
    18 }
    19 echo "插入排序:".implode(',',InsertSort($arr));

       运行结果如下:

      

    五:算法补充:求一组队列中负数和正数的个数(队列长度大于1无疑问)

     1 <?php
     2 //定义一个数组变量并且赋值
     3 $array=array(1,3,4,-1,5,-5,9,8);
     4 
     5 //封装一个名为Ceshi的方法,
     6 function Ceshi($array,&$a,&$b){//形参,&是传引用
     7     //count()函数是php自带的求一个数组长度的函数
     8     $length=count($array);
     9     //设两个变量用来计数并且初始化
    10     $a=0;
    11     $b=0;
    12     for($i=0;$i<$length-1;$i++){
    13         if($array[$i]>0){//如果数组元素>0,就将$a加1
    14             $a++;//后面不需要return
    15         }else{
    16             $b++;
    17         }
    18     }
    19     return $array;//不能省略
    20     
    21 }
    22 Ceshi($array,$a,$b);//实参
    23 echo 'a='.$a.'  b='.$b;//.是将他们连接起来的意思

          运行结果:

  • 相关阅读:
    Fedora 23 配置
    小小的告别一下这个博客
    markdown测试
    ihhh题解
    【BZOJ】1998: [Hnoi2010]Fsk物品调度
    【BZOJ】2563: 阿狸和桃子的游戏
    【BZOJ】3712: [PA2014]Fiolki
    【BZOJ】2333: [SCOI2011]棘手的操作
    我的vimrc
    Ubuntu Gnome 14.04.2 lts 折腾笔记
  • 原文地址:https://www.cnblogs.com/ttxcs/p/11655172.html
Copyright © 2011-2022 走看看