php算法总结附代码

php算法排序总结



前言

提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


提示:以下是本篇文章正文内容,下面案例可供参考

一、算法的基本常识

1.时间复杂度 时间 循环次数 O(1) O(N) O(N²) O(N*M) 2.空间复杂度 占用空间内存 3.时间换空间 空间换时间

二、下面附上一些常用算法代码

1、斐波那契

代码如下(示例):

//数组法
function test($num){
    $arr=[];
    for($i=0;$i<=$num;$i++)
    {
        if($i==0 || $i==1){
            $arr[$i]=1;
        }else{
            $arr[$i]=$arr[$i-1]+$arr[$i-2];
        }
    }
    return $arr[$num];
}
print_r(test(10));
//递归法
function fib_recursive($n){  
    if($n==0||$n==1){return 1;}  
    else{  
        return fib_recursive($n-1)+fib_recursive($n-2);  
    }  
}  
echo fib_recursive(10); 

2、二分查找(数组里查找某个元素)

代码如下(示例):

function binaryRecursive(&$arr,$low,$top,$target){
    if($low<=$top){
        $mid = floor(($low+$top)/2);
        if($arr[$mid]==$target){
            return $mid;
        }elseif($arr[$mid]<$target){
            return binaryRecursive($arr,$mid+1,$top,$target);
        }else{
            return binaryRecursive($arr,$low,$mid-1,$target);
        }
    }else{
        return -1;
    }
}
$arr = array(1,3,9,23,54);
echo binaryRecursive($arr, 0, sizeof($arr), 23);

3、冒泡排序(数组排序)

思路分析:在要排序的一组数中,对当前还未排好的序列,从前往后对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即,每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。

代码如下(示例):

$arr=array(1,43,54,62,21,66,32,78,36,76,39); 
function bubble_sort( $array)  
{  
  $count = count( $array);  
   if ($count <= 0 ) return false;  
   for($i=0 ; $i<$count; $i ++){  
  for($j=$count-1 ; $j>$i; $j--){  
  if ($array[$j] < $array [$j-1]){  
    $tmp = $array[$j];  
  $array[$j] = $array[ $j-1];  
  $array [$j-1] = $tmp;  
     }  
    }  
  }  
  return $array;  
}  

4、快速排序(数组排序)

思路分析:选择一个基准元素,通常选择第一个元素或者最后一个元素。通过一趟扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素。此时基准元素在其排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分。

代码如下(示例):

function quick_sort($arr)
{
    // 判断是否需要运行,因下面已拿出一个中间值,这里<=1
    if (count($arr) <= 1) {
        return $arr;
    }

    $middle = $arr[0]; // 中间值

    $left = array(); // 接收小于中间值
    $right = array();// 接收大于中间值

    // 循环比较
    for ($i=1; $i < count($arr); $i++) {

        if ($middle < $arr[$i]) {

            // 大于中间值
            $right[] = $arr[$i];
        } else {

            // 小于中间值
            $left[] = $arr[$i];
        }
    }

    // 递归排序划分好的2边
    $left = quick_sort($left);
    $right = quick_sort($right);

    // 合并排序后的数据,别忘了合并中间值
    return array_merge($left, array($middle), $right);
}

print_r(quick_sort($arr));

5、选择排序

思路分析:在要排序的一组数中,选出最小的一个数与第一个位置的数交换。然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。

代码如下(示例):

function selectSort($arr) {
//双重循环完成,外层控制轮数,内层控制比较次数
 $len=count($arr);
    for($i=0; $i<$len-1; $i++) {
        //先假设最小的值的位置
        $p = $i;
        for($j=$i+1; $j<$len; $j++) {
            //$arr[$p] 是当前已知的最小值
            if($arr[$p] > $arr[$j]) {
            //比较,发现更小的,记录下最小值的位置;并且在下次比较时采用已知的最小值进行比较。
                $p = $j;
            }
        }
        //已经确定了当前的最小值的位置,保存到$p中。如果发现最小值的位置与当前假设的位置$i不同,则位置互换即可。
        if($p != $i) {
            $tmp = $arr[$p];
            $arr[$p] = $arr[$i];
            $arr[$i] = $tmp;
        }
    }
    //返回最终结果
    return $arr;
}

6、插入排序

思路分析:在要排序的一组数中,假设前面的数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。

代码如下(示例):

function insertSort($arr) {
         $len = count($arr);
      for ($i = 1; $i < $len; $i++) {
                 // 当前值
          $key = $arr[$i];
         // 当前位置
         $pos = $i;
        // 如是当前位置 >0 && 当前值的前一个值 > 当前值 选出最值
         while ($pos > 0 && $arr[$pos - 1] > $key) {
                         // 当前值  =  前一个值
             $arr[$pos] = $arr[$pos - 1];
             // 当前位置后移
             $pos = $pos - 1;
        }
         // 找到当前值的位置
         $arr[$pos] = $key;
     }
     return $arr;
 }
var_dump(insertsort($arr));

7、桶排序

代码如下(示例):

$arr=[3,4,7,5,2,1,4];
function tong($arr){
    $max=max($arr);
    $min=min($arr);
    $sort=[];
    for($i=$min;$i<=$max;$i++){
        $sort[$i]=0;
    }
    foreach($arr as $k=>$v){
        $sort[$v] ++;
    }
    $new=[];
    foreach($sort as $k=>$v){
        while($v --){
            $new[]=$k;
        }
    }
    return $new;
}
var_dump(tong($arr));

8、猴子选大王

代码如下(示例):

$num=10;
$n=3;
function monkey($num,$n){
    if($num<=1){
        return 0;
    }
    $arr=range(1,$num);
    $i=0;
    while(count($arr)>1){
        if(($i+1)%$n==0){
            unset($arr[$i]);
        }else{
            array_push($arr,$arr[$i]);
            unset($arr[$i]);
        }
        $i++;
    }
    return $arr[$i];
}
print_r(monkey($num,$n));

总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,上文总结了一些php常用算法代码,希望会对你有一些帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值