视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
php需要学算法吗
2020-11-27 14:19:20 责编:小采
文档

php需要学算法吗

需要学,现在php不管是学习还是使用中碰到的问题基本都是函数方面的,很少接触到数据结构和算法之类的,但是我们要知道程序=数据结构+算法,可见算法对程序有多重要。

要往高级走的话算法和数据结构是必会的,但不是用PHP去实现,因为PHP的运行效率太低了,用来完成算法级别的东西一般都需要大量的循环,所以数学问题及算法的实现在PHP中标准的做法应该是做成C扩展,就是说算法都要用C去实现,并且学会PHP的C扩展开发。

基本算法:

冒泡排序

//逐行对比,满足条件则交换
function bubbleSort($arrData,$sort = 'desc')
{
 if(empty($arrData)) return $arrData;
 //默认有序
 $isSorted = true;
 $nCount = count($arrData);
 for($i = 0; $i < $nCount; $i++) {
 //对比次数随着循环逐渐减少,因为后面的数据已经处理为有序
 for($j = 0; $j < ($nCount - $i - 1); $j++) {
 //执行判断
 $isChange = $sort == 'desc' ? $arrData[$j] < $arrData[$j+1] : $arrData[$j] > $arrData[$j+1];
 if($isChange) {
 //首次对比,判断是否有序
 $isSorted = false;
 $temp = $arrData[$j];
 $arrData[$j] = $arrData[$j+1];
 $arrData[$j+1] = $temp;
 }
 }
 if($isSorted) break;
 }
 return $arrData;
}

快速排序

//选取一个标准,和其他数据对比后将数据分为两批,递归执行后合并
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;
}

二分查找

//假设数据是按升序排序的,对于给定值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;
}

顺序查找

function seqSearch($arr,$toSearch)
{
 $nCount = count($arr);
 for ($i=0; $i < $nCount; $i++) {
 if ($arr[$i] == $toSearch) {
 return $i;
 }
 }
 return -1;
}

选择排序

//在第一次循环中,假设第一个数是最小的;然后跟第二个数比较,一直比到最后,找出最小值,然后把最小值跟第一个数的位置互换;
//再进行下一次循环,找出最小值跟第二个位置的数互换;一直循环数组的个数减去1次;数组就成了有序的了 
function selectSort($arr)
{
 $nCount = count($arr);
 //遍历取得需要排序的数
 for($i = 0; $i < $nCount; $i++) {
 //选择需要比较的数,从$i开始到结束
 for($j = $i + 1; $j < $nCount; $j++) {
 //比较
 if($arr[$j] < $arr[$i]) {
 $temp = $arr[$i];
 $arr[$i] = $arr[$j];
 $arr[$j] = $temp;
 }
 }
 }
 return $arr; 
}

更多PHP相关知识,请访问PHP中文网!

下载本文
显示全文
专题