php 常用算法

本文深入探讨了PHP编程中常见的算法应用,包括排序、搜索、字符串处理等方面,旨在提升开发者在实际项目中的算法运用能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<?php

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

$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++)  
        {  
        	//比较大小
            if($arr[$k]>$arr[$k+1])  
            {  
                $tmp=$arr[$k+1];  //两者互换位置
                $arr[$k+1]=$arr[$k];  
                $arr[$k]=$tmp;  
            }  
        }  
    }  
    return $arr;  
} 

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

function selectSort($arr) 
{
    //双重循环完成,外层控制轮数,内层控制比较次数(7.5.2.9.3)
    $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;
}

/*3.二分查找
	*假设数据是按升序排序的,对于给定值x,从序列的中间位置开始比较,如果当前位置值等于x,则查找成功;
	*若x小于当前位置值,则在数列的前半段中查找;若x大于当前位置值则在数列的后半段中继续查找,直到找到为止
*/
function binSearch($toSearch,$arr)
{
    //确定当前的检索范围
    $nCount = count($arr);
    //低位键,初始为0
    $nLowNum = 0;
    //高位键,初始为末尾 
    $nHighNum = $nCount - 1;

    while($nLowNum <= $nHighNum) {
        //选定大概中间键
        $nMiddleNum = intval(($nHighNum + $nLowNum)/2);

        if($arr[$nMiddleNum] > $toSearch) {
            //比检索值大
            $nHighNum = $nMiddleNum - 1;
        } elseif ($arr[$nMiddleNum] < $toSearch) {
            //比检索值小
            $nLowNum = $nMiddleNum + 1;
        } else {
            return $nMiddleNum;
        }
    }

    return false;
}

/*4.快速排序
	*选取一个标准,和其他数据对比后将数据分为两批,递归执行后合并
*/
function quickSort(&$arr, $sort = 'asc'){

    //检查数据,多于一个数据才执行
    $nCount = count($arr);
    if($nCount > 1) {
        //选取标准(第一个数据)
        $nStandard = $arr[0];
        $arrLeftData = [];
        $arrRightData = [];
        //遍历,注意这里从1开始比较
        for($i = 1; $i < $nCount; $i++) {

            if($sort == 'desc') {
                $arr[$i] > $nStandard ? $arrLeftData[] = $arr[$i] : $arrRightData[] = $arr[$i];
            } else {
                $arr[$i] > $nStandard ? $arrRightData[] = $arr[$i] : $arrLeftData[] = $arr[$i];
            }
        }
        $arr = array_merge($this->quickSort($arrLeftData, $sort), array($nStandard), $this->quickSort($arrRightData, $sort));
    }
    return $arr;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值