PHP 常见算法

冒泡排序

$arr=array(1,43,54,62,21,66,32,78,36,76,39);  

/**
 * [getPao 就是像冒泡一样,每次从数组当中 冒一个最大的数出来]
 * @param  [type] $arr [数组]
 * @return [type]      [description]
 */
function getPao($arr){
  $len = count($arr);
  for($i = 0; $i < $len ; $i++){
      for($k = 0; $k < $len -1 ;$k++){
        if($arr[$k+1] > $arr[$k]){
          $tmp = $arr[$k+1];
          $arr[$k+1] = $arr[$k];
          $arr[$k] = $tmp;
        }
      }        
  }
  return $arr;
}

//冒泡优化
//交换方法
function swap(array &$arr,$a,$b){
    $temp = $arr[$a];
    $arr[$a] = $arr[$b];
    $arr[$b] = $temp;
}
/冒泡排序的优化(如果某一次循环的时候没有发生元素的交换,则整个数组已经是有序的了)
function BubbleSort1(array &$arr){
    $length = count($arr);
    $flag = TRUE;

    for($i = 0;($i < $length - 1) && $flag;$i ++){
        $flag = FALSE;
        for($j = $length - 2;$j >= $i;$j --){
            if($arr[$j] > $arr[$j + 1]){
                swap($arr,$j,$j+1);
                $flag = TRUE;
            }
        }
    }
}

快速查找

/**
 * [getQuick 先使用一个固定的值,然后和数组中其他的数值进行对比,比当前小的数组放到一个数组中,比当前大的数组分当道另一个数组中,这两个数组重复前面的方法在进行排序,排好序的两个数组进行合并]
 * @param  [type] $arr [description]
 * @return [type]      [description]
 */

function getQuick($arr){
  $len = count($arr);

  if($len <= 1){
    return $arr;
  }

  $num = $arr[0];
  $big = array();
  $small = array();

   foreach($arr as $v){
    if($v > $num)
        $big[] = $v;  //把比$num大的数放到一个数组里
    if($v < $num)
        $small[] = $v;   //把比$num小的数放到另一个数组里
    }

  $big = getQuick($big);
  $small = getQuick($small);
  return array_merge($big, array($num), $small);
}

二分查找

$arr1 = array(1,2,3,4,5,6,7,8,9,12,23,33,35,56,67,89,99); 
/**
 * [getCheck 假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。]
 * @param  [type] $arr1 [数组]
 * @param  [type] $k  [要查找的]
 * @return [type]       [description]
 */
 //递归
function bin_sch($array, $low, $high, $k){  
    if ($low <= $high){  
        $mid = intval(($low+$high)/2);  
        if ($array[$mid] == $k){  
            return $mid;  
        }elseif ($k < $array[$mid]){  
            return bin_sch($array, $low, $mid-1, $k);  
        }else{  
            return bin_sch($array, $mid+1, $high, $k);  
        }  
    }  
    return -1;  
} 
//非递归
function getCheck($arr1,$num){
  $len = count($arr1);
  $low = 0;
  $high = $len -1;
  while($low <= $high){
    $middle = floor(($low + $high)/2);
    if($num == $arr1[$middle]){
      return $middle;
    }elseif($num < $arr1[$middle]){
      $high = $middle -1 ;
    }else{
      $low = $middle +1 ;
    }
  }

}

猜你喜欢

转载自blog.csdn.net/weixin_38642740/article/details/81386813