PHP数组的一些常见算法

递推算法-解决斐波那契数列
公式:F(N) = F(N - 1) + F(N - 2);
@param $n 代表要获取斐波那契数列上第N个位置的数值

function fs1($n){
  #求$n = 1 和 $n = 2的长度的数列位置永远都是1
  if($n == 1 || $n == 2)return 1;
  $res[0] = 1;
  $res[1] = 1;
  for($i = 2; $i < $n; $i++){
    $res[$i] = $res[$i - 1] + $res[$i - 2];
  }
  return array_pop($res);
}

递归算法-解决斐波那契数列
@param $n 代表要获取斐波那契数列上第N个位置的数值

function fs2($n){
  #求$n = 1 和 $n = 2的长度的数列位置永远都是1
  if($n == 1 || $n == 2) return 1;
  #形成一个二叉树结构
  return fs2($n - 1) + fs2($n - 2);
}

冒泡排序

function bubbleSort(&$arr){
  for($i = 0,$len = count($arr); $i < $len; $i++){
    #当第一次筛选的时候可以找到最大的数
    #那么就不需要再判断最后一位的大小所以 - $i
    for($j = 0; $j < len - 1 - $i; $j++){
      if($arr[$j] > $arr[$j + 1]){
        $temp = $arr[$j + 1];
        $arr[$j + 1] = $arr[$j];
        $arr[$j] = $temp;
      }
    }
  }
}

选择排序
先在数组中找到最小的一个然后和第一个元素调换位置
然后在找到第二小的和第二个元素调调换位置 以此类推

function selectSort(&$arr){
  for($i = 0,$len = count($arr); $i < $len; $i++){
    $min = $i;
    for($j = $i + 1; $j < $len - 1; $j++){
      if($arr[$min] > $arr[$j]){
        $min = $j;
      }
    }
    if($min != $i){
      $temp = $arr[$i];
      $arr[$i] = $arr[$min];
      $arr[$min] = $temp;
    }
  }
}

插入排序
找到要插入的位置,并将要插入位置后的元素向后移动一位

function insertSort(&$arr){
  for($i = 1,$len = count($arr); $i < $len; $i++){
  $temp = $arr[$i];
    for($j = $i - 1; $j >= 0; $j--){
      if($arr[$j] > $temp){
        $arr[$j + 1] = $arr[$j];
        $arr[$j] = $temp;
      }else{
        break;
      }
    }
  }
}

快速排序
通过中间值进行拆分,最后在组合起来

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

归并排序
将数组进行拆分,后再排序,再合并

 

function mergeSort($arr){
  $len = count($arr);
  if($len <= 1) return $arr;

  $middle = floor($len / 2);
  $left = array_slice($arr,0,$middle);
  $right = array_slice($arr,$middle);

  $left = mergeSort($left);
  $right = mergeSort($right);

  $res = array();
    while(count($left) && count($right)){
    $res[] = $left[0] < $right[0] ? array_shift($left) : array_shift($right);
  }

  return array_merge($res,$left,$right);
}

顺序查找
遍历数组然后判断即可

function orderSearch($arr,$target){
  for($i = 0,$len = count($arr); $i <= $len; $i++){
    if($arr[$i] == $target){
      return $arr[$i];
    }
  }
  return false;
}

 

二分查找法
将数组进行范围拆分,直到找到目标为止

function binarySearch($arr,$target){

  $lborder = 0;
  $rborder = count($arr);

  while($lborder <= $rborder){

    $middle = floor(($lborder + $rborder) / 2);

    if($arr[$middle] == $target){
      return $middle + 1;
    }else if($arr[$middle] < $target){
      $lborder = $middle + 1;
    }else {
      $rborder = $middle - 1;
    }
  }
  return false;
}

 

转载于:https://www.cnblogs.com/Richard-Tang/p/9809508.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值