常用的 PHP 搜索排序算算法 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区

查找算法

  • 顺序查找
    $arr=array(46,90,900,0,-1);
    //这是按顺序查询
    function search(&$arr,$findVal){     
    $flag=false;
    for($i=0;$i<count($arr);$i++){
        if($findVal==$arr[$i]){
           echo "找到了,下标为=$i";
           $flag=true;
           break;
           }
        }
     if(!$flag){
         echo "查无此数";
     }
    }
  • 二分查找(取半,向上取整比较,比较值大于中间值则最小值等于中间值+1,反之亦然)
 /**二分查找:查找一个值在数组中的位置
    * @$arr:操作的数组,前提是按顺序排列
    * @$val:查找的值
    * @$low:查找的起始位置,默认从数组的第一个数找起
    * @hight:查找的结束位置
    **/
    Function binarySearch($arr, $val, $hight, $low=0){
            while($low<= $hight){
                    $mid= ceil($low+ ($hight- $low) / 2);
                    if($arr[$mid] == $val){
                            return$mid;
                    }elseif($arr[$mid] > $val){
                            $hight= $mid-1;
                    }else{
                            $low= $mid+1;
                    }
            }
            return-1;
    }
    //产生一个数组
    $arr= range(0,20);
    //查找的起始位置
    $low= 0;
    //查找的结束位置
    $hight= count($arr) - 1;
    //查找的值
    $findVal= rand(0, 20);
    $index= binarySearch($arr, $findVal, $hight, $low);
    printf("查找的值 '%d' 在数组中的下标 '%s'", $findVal, $index);

排序算法

  • 冒泡排序
    思路分析:在要排序的一组数中,对当前还未排好的序列,从前往后对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即,每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。
        代码实现:
        $arr=array(1,43,54,62,21,66,32,78,36,76,39);  
        function bubbleSort($arr)
        {  
            $len=count($arr);
            //该层循环控制 需要冒泡的轮数
            for($i=1;$i<$len;$i++)
            { 
                for($k=0;$k<$len-$i;$k++)//$len-$i比较的次数
                {
                     if($arr[$k]>$arr[$k+1])//前面数大于后面就交换
                        {
                                $tmp=$arr[$k+1];
                                $arr[$k+1]=$arr[$k];
                                $arr[$k]=$tmp;
                        }
                 }
            }
            return $arr;
        }

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

代码实现:
        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;    //返回最终结果
        }
  • 插入排序
    思路分析:在要排序的一组数中,假设前面的数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。
    代码实现:
    function insertSort($arr) {
            $len=count($arr); 
            for($i=1, $i<$len; $i++) {
                    $tmp = $arr[$i];//temp是要比较的数据
                    //内层循环实现比较并插入
                    for($j=$i-1;$j>=0;$j--) {//第一个数已经排好序
                            if($tmp < $arr[$j]) {
                                    //发现插入的元素要小,交换位置,将后边的元素与前面的元素互换
                                    $arr[$j+1] = $arr[$j];
                                    $arr[$j] = $tmp;
                            } else {
                                    //如果碰到不需要移动的元素,由于是已经排序好是数组,则前面的就不需要再次比较了。
                                    break;
                            }
                    }
            }
            return $arr;
    } 
  • 快速排序 (第一元素为基准,递归折半排序,每次排序array_merge)
    思路分析:选择一个基准元素,通常选择第一个元素或者最后一个元素。通过一趟扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素。此时基准元素在其排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分。
    代码实现:
    function quickSort($arr) {
            //先判断是否需要继续进行
            $length = count($arr);
            if($length <= 1)   return $arr;
            $base_num = $arr[0]; //选择第一个元素作为基准
            $left_array = array();  //小于基准的
            $right_array = array();  //大于基准的
            //遍历除了标尺外的所有元素,按照大小关系放入两个数组内
            for($i=1; $i<$length; $i++) {
                    if($base_num > $arr[$i]) {
                            //放入左边数组
                            $left_array[] = $arr[$i];
                    } else {
                            //放入右边
                            $right_array[] = $arr[$i];
                    }
            }
            //再分别对左边和右边的数组进行相同的排序处理方式递归调用这个函数
            $left_array = quick_sort($left_array);
            $right_array = quick_sort($righ·t_array);
            //合并
            return array_merge($left_array, array($base_num), $right_array);
    }
  • 如果可以,我要变成光

Original url: Access

Created at: 2018-10-10 18:55:38

Category: default

Tags: none

请先后发表评论
  • 最新评论
  • 总共0条评论