zoukankan      html  css  js  c++  java
  • PHP数组基本排序算法和查找算法

    关于PHP中的基础算法,小结一下,也算是本博客的第一篇文章

    1.2种排序算法
    冒泡排序:
    例子:个人见解
    	5 6 2 3 7 9
    
    	第一趟
    	5 6 2 3 7 9
    	5 2 6 3 7 9
    	5 2 3 6 7 9
    	5 2 3 6 7 9
    	5 2 3 6 7  9
    
    	第二趟
    	2 5 3 6 7  9
    	2 3 5 6 7  9
    	2 3 5 6 7  9
    	2 3 5 6  7  9
    
    	第三趟
    	2 3 5 6  7  9
    	2 3 5 6  7  9
    	2 3 5  6  7  9
    
    	第四趟
    	2 3 5  6  7  9
    	2 3  5  6  7  9
    
    	第五趟
         2  3  5  6  7  9 

        两两比较,每一趟中都会确定出最大的数然后放在右边,冒泡速度较慢,但是比较稳定。

     代码方面主要是嵌套的for循环

     代码:

     1 #冒泡排序
     2 #原理两两比较,大的放右边,每次循环会排出一个最大的放在右边
     3 function maopao($arr){
     4     $len=count($arr);
     5     for ($i=0; $i < $len-1; $i++) { 
     6         for ($a=0; $a <$len-1-$i ; $a++) { 
     7             if ($arr[$a]>$arr[$a+1]) {
     8                 $t=$arr[$a];
     9                 $arr[$a]=$arr[$a+1];
    10                 $arr[$a+1]=$t;
    11             }
    12         }
    13     }
    14     return $arr;
    15 
    16 }
    17 $arr=[5,6,8,1,2,3,7,55,69,23,11];
    18 var_dump(maopao($arr));
    选择排序:
    例子:个人见解
    	#选择排序
    	8 5 6 2 4 7
    
    	第一趟
    	5 8 6 2 4 7
    	5 8 6 2 4 7
    	2 8 6 5 4 7
    	2 8 6 5 4 7
    	2  8 6 5 4 7
    
    	第二趟
    
    	2  6 8 5 4 7
    	2  5 8 6 4 7
    	2  4 8 6 5 7
    	2  4  8 6 5 7
    
    	第三趟
    
    	2  4  6 8 5 7
    	2  4  5 8 6 7
    	2  4  5  8 6 7
    
    	第四趟
    	2  4  5  6 8 7
    	2  4  5  6  8 7
    
    	第五趟
    	2  4  5  6  7  8
    

    假设数组中靠左的元素是小的,然后跟右边的元素比较,如果左边的大于右边的就换到左边,每趟都能确定出一个最小值,缺点在于不稳定性,速度快于冒泡排序。
    代码:
     1 #选择排序
     2 #那最左边的和右边比较如果大于就换到右边,每趟确定出一个最小值
     3 function xuanze($arr){
     4     $len=count($arr);
     5     for ($i=0; $i <$len-1 ; $i++) { 
     6         //假设当前最左边的元素是最小值,保存下标
     7         $key=$i;
     8         for ($j=$i+1; $j < $len; $j++) { 
     9             //如果左边的大于右边的就保存下标
    10             if($arr[$key]>$arr[$j]){
    11                 $key=$j;
    12             }
    13         }
    14         //找到最小的值,交换下标
    15         $temp=$arr[$key];
    16         $arr[$key]=$arr[$i];
    17         $arr[$i]=$temp;
    18     }
    19     return $arr;
    20 }
    21 $arr=[11,2,3,55,66,99];
    22 var_dump(xuanze($arr));

    快速排序:

    原理:先取数组中的任意一个数作为基准数,一般是数组下标的第一个,然后遍历一遍数组,声明两个空数组,升序的话,将小的元素放在左边,将大的元素放在右边,然后利用递归进行继续分多个数组然后排序。

    function quick_sort($arr){
         $len=count($arr);
         if($len<=1)return $arr;
         $left=$right=[];
        for($i=1;$i<$len;$++;){
            if($arr[0]>$arr[$i]){
              $left[]=$arr[$i];
            }else{
              $right[]=$arr[$i];
           }
        }
       $left=quick_sort($left);
       $right=quick_sort($right);
        return arrr_merge($left,array($arr[0]),$right);
    }

    关于排序先写三个,日后跟新~~

    1.2种查找算法
    顺序查找:
    这个比较简单,原理就是从第一个开始比较直到找到,效率比较低,较稳定。
    代码:
    #选择排序
    #存在值返回该值的下标,不存在返回false
    function shunxu($arr,$target){
        $len=count($arr);
        for ($i=0; $i <$len ; $i++) { 
            if ($arr[$i]==$target) {
                return $i;
            }
        }
        return false;
    }
    $arr=[2,5,6,3,8,52,6];
    var_dump(shunxu($arr,52));
    二分法查找
    条件严格,数组必须有序排列,效率较高。
    原理:取一个中间值进行和要查找的值比较,假如数组升序排序,值大于要查找的值,然后下标减一
    
    
    #二分法查找
    #选择升序数组
    function erfen($arr,$target){
        $len=count($arr)-1;
        $middle=ceil($len/2);
        if ($arr[$middle]==$target) {
            return true;
        }elseif($arr[$middle]>$target){
            for ($i=0; $i <$middle ; $i++) { 
            if ($arr[$i]==$target) {
                return true;
            }
        }
      }else{
          //因为循环的是长度所以得+1
          for ($i=$middle; $i < $len+1 ; $i++) { 
            if ($arr[$i]==$target) {
                return true;
            }
        }
      }
      return false;
    }
    $arr=[1,2,3,4,5,6,7,10,11];
    var_dump(erfen($arr,11));
    
    

    先写这几个吧,日后在更!

     
     
  • 相关阅读:
    js命名空间
    window安装node.js
    JS添加可信站点、修改ActiveX安全设置,禁用弹出窗口阻止程序的方法
    Javascript 操作select控件大全(新增、修改、删除、选中、清空、判断存在等)
    DIV+CSS两种盒子模型
    table中的tbody标签
    兼容获取元素的样式属性值
    Arch linux 使用心得
    763. 划分字母区间
    <Leetcode>93. 复原地址
  • 原文地址:https://www.cnblogs.com/bjphp/p/8454416.html
Copyright © 2011-2022 走看看