php常用算法

<?php
//插入排序
$arr = array(123, 0, 1111,5, -1, 4, 15);
function insertSort(&$arr) {
	$m = count($arr);
	for($i=1;$i<$m;$i++){
		
		$inseartValue = $arr[$i];
		$index = $i-1;
		//如果没找到插入未知
		while ($index>=0 && $inseartValue<$arr[$index]) {
			$arr[$index+1] = $arr[$index];
			$index -- ;
		}
		//找到插入位置;
		$arr[$index+1] = $inseartValue;
	}
}
insertSort($arr);
//print_r($arr);
######################################################

/**
 * 二分查找
 */

 function binarySerch($arr,$left,$right,$v){
 	$mid = floor($left+$right)/2;
	if($left<=$right){
		if($arr[$mid] == $v){
			return $mid;
		}
		
		if($arr[$mid]>$v){//在左边
			return 	binarySerch($arr, $left, $mid-1, $v);
		}else{//在右边
			return binarySerch($arr, $mid+1, $right, $v);
		}
		
	}
	
	return -1;
 }
 
$arr = array(1,5,8,10,11,100);
$i = binarySerch($arr, 0, count($arr)-1, 1000);
//echo $i;
##############################################################################
/**
 * 快速排序
 */

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

 }

$arr = array(123, 0, 1111,5, -1, 4, 15);
$a = quickSort($arr);
#######print_r($a); 
########################################################################

/*
 * 冒泡排序
 */

 function pupSort(&$arr){
 	$m = count($arr);
	for ($i=0; $i <$m; $i++) { 
		
		for ($j=0; $j <$m-$i-1; $j++) { 
			if($arr[$j]>$arr[$j+1]){
				list($arr[$j],$arr[$j+1]) = array($arr[$j+1],$arr[$j]);	
			}
		}
		
	}
 }
$arr = array(123, 0, 1111,5, -1, 4, 15);
$a = pupSort($arr);
//print_r($arr); 
#################################################
/**
 * 希尔排序
 * 时间复杂度为O(n3/2)
 */
function shellSort(&$arr){
	
	$n = count($arr);
	//设置步长为每次元素的一半长度
	for ($gap=floor($n/2); $gap >0 ; $gap=floor($gap/2)) { 
		//对步长的元素进行插入排序
		for($i=$gap;$i<$n;$i++){
			$v = $arr[$i];
			$k = $i-1;
			//寻找插入位置;
			while ($k>=0 && $v<$arr[$k]) {
				$arr[$k+1] = $arr[$k];
				$k--;
			}
			$arr[$k+1] = $v;
			
		}
	}
}
$arr = array(123, 0, 1111,5, -1, 1, 15);
$a = shellSort($arr);
//print_r($arr); 
#####################################################################
 /**
 * 计数排序/桶子排序
 */
function radixSort($arr,$p=1){
	
	$radix = 0;
	$temp = array();
	for($i=0;$i<count($arr);$i++){
		$radix = max($radix,strlen($arr[$i]));
		$index = strlen($arr[$i])>=$p ? substr($arr[$i],-$p,1) : 0;
		$temp[$index][] = $arr[$i];
	}
	//数组重新转换
	$tp = array();
	for ($i=0; $i <10 ; $i++) {
		if(isset($temp[$i])){
			foreach($temp[$i] as  $value) {
				$tp[] = $value;
			}	
		}
	}
	return $p <= $radix ? radixSort($tp,$p+1) : $tp;
}
$arr = array(123, 0, 1111,5, 1, 15);
$p = radixSort($arr);
//print_r($p);
###################################################################################
/**
 * 堆排序
 * 时间复杂度 Olog(n)
 */
 //建堆
 function build_heap(&$array,$i,$heapsize){

        $left = $i*2+1;
        $right = $left + 1;
        $max = $i;
        if($i < $heapsize && $left<$heapsize  && $array[$left] > $array[$i] ){
                $max = $left;
        }

        if($i < $heapsize && $right<$heapsize && $array[$right] > $array[$max]){
                $max = $right;
        }
        if($i != $max && $i < $heapsize && $max < $heapsize){
                list($array[$i],$array[$max])=array($array[$max],$array[$i]);
                build_heap($array,$max,$heapsize);

        }
}

function sortHeap(&$array,$heapsize){
        while($heapsize){
                list($array[0],$array[$heapsize-1])=array($array[$heapsize-1],$array[0]);
                $heapsize = $heapsize -1;
                build_heap($array,0,$heapsize);
        }
}

function createHeap(&$array,$heapsize){
        $i = ceil($heapsize/2)-1;
        for(;$i>=0;$i--){
                build_heap($array,$i,$heapsize);
        }
}

function heapSort(&$array){
        $heapsize = count($array);
        createHeap($array,$heapsize);
        sortHeap($array,$heapsize);
}

 $arr = array(123, 0, 1111,5, 1, 15,29);
heapSort($arr);
//print_r($arr);
###############################################################################
/**
 * 归并排序
 * 时间复杂度 Θ(nlgn);
 */
 
 #### 合并排序
 function merge(&$arr,$start,$mid,$end){
 	$i = $start;
	$j = $mid+1;
	$k=0;
 	$ary = array();
	while ($i <= $mid && $j<=$end){
		if($arr[$i]<=$arr[$j]){
			$ary[$k++] = $arr[$i++];
		}else{
			$ary[$k++] = $arr[$j++];
		}
	}	
	while($i <= $mid) {
          	 $ary[$k++] = $arr[$i++];
   	}
   	while($j <= $end) {
   	       	$ary[$k++] = $arr[$j++];
   	}
	for($i = 0 ;$i < $k;$i++){
   		$arr[$i + $start] = $ary[$i];
   	}
	
}

//分成n个片段
function mergeSort(&$array,$low,$high) {
       	if($low < $high) { // 任何递归都要有边界,否则就是死循环
       	       	$mid = floor(($low+$high)/ 2);
       	       	mergeSort($array,$low,$mid);
       	       	mergeSort($array,$mid+1,$high);
       	       	merge($array,$low,$mid,$high);
       	} else {
       	       	return ;// 这里其实可以不写,php内部默认都会自动加return的
       	}
}

$arr = array(123, 0, 1111,5, 1, 15,29);
mergeSort($arr,0,6);
//print_r($arr); 
 
#############################################################
//矩阵求最长公共子串
function sub_string($str1,$str2)
{
   $max = 0; //字符串最大长度
   $current = 0;  //记录str1的当前位置.
   $str1_len = strlen($str1);
   $str2_len = strlen($str2);
   $arr = array();
   //初始化矩阵
   for($i =0;$i <$str1_len;$i++)
     for($j =0; $j< $str2_len;$j++)
       $arr[$i][$j] = 0;
   //找出最大公约子串
   for($i = 0; $i < $str1_len; $i++)
     for($j = 0; $j < $str2_len; $j++)
       {
          if($str1[$i] == $str2[$j])
               {
                   if ($i ==0 ||$j ==0)
                       $arr[$i][$j]=1;
                   else //在矩阵中记录,得到最长的斜线就是最大的公约子串.
                    $arr[$i][$j] = $arr[$i-1][$j-1]+1;  
                   if($max < $arr[$i][$j])
                      {
                        $max = $arr[$i][$j];
                        $current = $i;
                      }
               }
       }
    if($max  == 0)
      return false;
   else   //$current+1-$max,找到最长公约字符串的开始位置
     return substr($str1,$current+1-$max,$current);
}

$str1 = "abcsdf";
$str2 = "bbcsggg";
$sub_str = sub_string($str1,$str2);
if( $sub_str != false)
    echo $sub_str;















?>

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这里是用PHP写的几个基础算法算法的重要性貌似对于PHP程序员不怎么重要,其实是非常重要的,经典名句:算法+数据结构=程序。作为一名真正的高级PHP程序员,我认为应该熟悉C,如果你想成为真正的程序员,请好好学C,学好数据结构与算法。这里仅仅只是几个基础算法,还有很多东东要学…… 1、首先来画个菱形玩玩,很多人学C时在书上都画过,咱们用PHP画下,画了一半。 思路:多少行for一次,然后在里面空格和星号for一次。 <?phpfor($i=0;$i<=3;$i++){ for($j=0;$j<=3-$i;$j++){ echo ' '; } for($k=0;$k<=2*$i;$k++){ echo '*'; } echo '<br/>'; } 2、冒泡排序,C里基础算法,从小到大对一组数排序。 思路:这题从小到大,第一轮排最小,第二轮排第二小,第三轮排第三小,依次类推…… <?php$arr = array(3, 2, 1);$n = count($arr); //每循环一次,就跑一趟后面的排序for($j=0; $j<$n-1; $j++) {//对后面没排好的,循环查找出最大(最小)的,进行一趟排序 for($i=$j; $i<$n-1; $i++) { if($arr[$j] > $arr[$i+1]) { $t = $arr[$j]; $arr[$j] = $arr[$i+1]; $arr[$i+1] = $t; } }}print_r($arr); 3、杨辉三角,用PHP写。 思路:每一行的第一位和最后一位是1,没有变化,中间是前排一位与左边一排的和,这种算法是用一个二维数组保存,另外有种算法用一维数组也可以实现,一行一行的输出,有兴趣去写着玩下。 11 11 2 11 3 3 11 4 6 4 11 5 10 10 5 1 <?php//每行的第一个和最后一个都为1,写了6行 for($i=0; $i<6; $i++) { $a[$i][0]=1; $a[$i][$i]=1; } //出除了第一位和最后一位的值,保存在数组中 for($i=2; $i<6; $i++) { for($j=1; $j<$i; $j++) { $a[$i][$j] = $a[$i-1][$j-1]+$a[$i-1][$j]; } } //打印 for($i=0; $i<6; $i++){ for($j=0; $j<=$i; $j++) { echo $a[$i][$j].' '; } echo '<br/>'; } 4、在一组数中,要求插入一个数,按其原来顺序插入,维护原来排序方式。 思路:找到比要插入数大的那个位置,替换,然后把后面的数后移一位。 <?php$in = 2;$arr = array(1,1,1,3,5,7);$n = count($arr);//如果要插入的数已经最大,直接打印if($arr[$n-1] < $in) { $arr[$n+1] = $in; print_r($arr); } for($i=0; $i<$n; $i++) {//找出要插入的位置 if($arr[$i] >= $in){ $t1= $arr[$i]; $arr[$i] = $in;//把后面的数据后移一位 for($j=$i+1; $j<$n+1; $j++) { $t2 = $arr[$j]; $arr[$j] = $t1; $t1 = $t2; }//打印 print_r($arr); die; }} 5、对一组数进行排序(快速排序算法)。 思路:通过一趟排序分成两部分,然后递归对这两部分排序,最后合并。 <?phpfunction q($array) { if (count($array) <= 1) {return $array;}//以$key为界,分成两个子数组 $key = $array[0]; $l = array(); $r = array(); //分别进行递归排序,然后合成一个数组 for ($i=1; $i<count($array); $i++) { if ($array[$i] <= $key) { $l[] = $array[$i]; } else { $r[] = $array[$i]; } } $l = q($l); $r = q($r); return array_merge($l, array($key), $r);} $arr = array(1,2,44,3,4,33);print_r( q($arr) ); 6、在一个数组查找你所需元素(二分查找算法)。 思路:以数组中某个值为界,再递归进行查找,直到结束。 <?phpfunction find($array, $low, $high, $k){ if ($low <= $high){ $mid = intval(($low+$high)/2); if ($array[$mid] == $k){ return $mid; }elseif ($k < $array[$mid]){ return find($array, $low, $mid-1, $k); }else{ return find($array, $mid+1, $high, $k); } } die('Not have...');} //test$array = array(2,4,3,5);$n = count($array);$r = find($array,0,$n, 7、合并多个数组,不用array_merge(),题目来于论坛。 思路:遍历每个数组,重新组成一个新数组。 <?phpfunction t(){ $c = func_num_args()-1; $a = func_get_args(); //print_r($a); for($i=0; $i<=$c; $i++){ if(is_array($a[$i])){ for($j=0; $j<count($a[$i]); $j++){ $r[] = $a[$i][$j]; } } else { die('Not a array!'); } } return $r;} //testprint_r(t(range(1,4),range(1,4),range(1,4)));echo '<br/>';$a = array_merge(range(1,4),range(1,4),range(1,4));print_r($a); 8、牛年求牛:有一母牛,到4岁可生育,每年一头,所生均是一样的母牛,到15岁绝育,不再能生,20岁死亡,问n年后有多少头牛。(来自论坛) <?phpfunction t($n) { static $num = 1 for($j=1; $j<=$n; $j++){ if($j>=4 && $j<15) {$num++;t($n-$j);} if($j==20){$num--;} } return $num;} //testecho t(8); 这里是用PHP写的几个基础算法算法的重要性貌似对于PHP程序员不怎么重要,其实是非常重要的,经典名句:算法+数据结构=程序。作为一名真正的高级PHP程序员,我认为应该熟悉C,如果你想成为真正的程序员,请好好学C,学好数据结构与算法。这里仅仅只是几个基础算法,还有很多东东要学…… 1、首先来画个菱形玩玩,很多人学C时在书上都画过,咱们用PHP画下,画了一半。 思路:多少行for一次,然后在里面空格和星号for一次。 <?phpfor($i=0;$i<=3;$i++){ for($j=0;$j<=3-$i;$j++){ echo ' '; } for($k=0;$k<=2*$i;$k++){ echo '*'; } echo '<br/>'; } 2、冒泡排序,C里基础算法,从小到大对一组数排序。 思路:这题从小到大,第一轮排最小,第二轮排第二小,第三轮排第三小,依次类推…… <?php$arr = array(3, 2, 1);$n = count($arr); //每循环一次,就跑一趟后面的排序for($j=0; $j<$n-1; $j++) {//对后面没排好的,循环查找出最大(最小)的,进行一趟排序 for($i=$j; $i<$n-1; $i++) { if($arr[$j] > $arr[$i+1]) { $t = $arr[$j]; $arr[$j] = $arr[$i+1]; $arr[$i+1] = $t; } }}print_r($arr); 3、杨辉三角,用PHP写。 思路:每一行的第一位和最后一位是1,没有变化,中间是前排一位与左边一排的和,这种算法是用一个二维数组保存,另外有种算法用一维数组也可以实现,一行一行的输出,有兴趣去写着玩下。 11 11 2 11 3 3 11 4 6 4 11 5 10 10 5 1 <?php//每行的第一个和最后一个都为1,写了6行 for($i=0; $i<6; $i++) { $a[$i][0]=1; $a[$i][$i]=1; } //出除了第一位和最后一位的值,保存在数组中 for($i=2; $i<6; $i++) { for($j=1; $j<$i; $j++) { $a[$i][$j] = $a[$i-1][$j-1]+$a[$i-1][$j]; } } //打印 for($i=0; $i<6; $i++){ for($j=0; $j<=$i; $j++) { echo $a[$i][$j].' '; } echo '<br/>'; } 4、在一组数中,要求插入一个数,按其原来顺序插入,维护原来排序方式。 思路:找到比要插入数大的那个位置,替换,然后把后面的数后移一位。 <?php$in = 2;$arr = array(1,1,1,3,5,7);$n = count($arr);//如果要插入的数已经最大,直接打印if($arr[$n-1] < $in) { $arr[$n+1] = $in; print_r($arr); } for($i=0; $i<$n; $i++) {//找出要插入的位置 if($arr[$i] >= $in){ $t1= $arr[$i]; $arr[$i] = $in;//把后面的数据后移一位 for($j=$i+1; $j<$n+1; $j++) { $t2 = $arr[$j]; $arr[$j] = $t1; $t1 = $t2; }//打印 print_r($arr); die; }} 5、对一组数进行排序(快速排序算法)。 思路:通过一趟排序分成两部分,然后递归对这两部分排序,最后合并。 <?phpfunction q($array) { if (count($array) <= 1) {return $array;}//以$key为界,分成两个子数组 $key = $array[0]; $l = array(); $r = array(); //分别进行递归排序,然后合成一个数组 for ($i=1; $i<count($array); $i++) { if ($array[$i] <= $key) { $l[] = $array[$i]; } else { $r[] = $array[$i]; } } $l = q($l); $r = q($r); return array_merge($l, array($key), $r);} $arr = array(1,2,44,3,4,33);print_r( q($arr) ); 6、在一个数组查找你所需元素(二分查找算法)。 思路:以数组中某个值为界,再递归进行查找,直到结束。 <?phpfunction find($array, $low, $high, $k){ if ($low <= $high){ $mid = intval(($low+$high)/2); if ($array[$mid] == $k){ return $mid; }elseif ($k < $array[$mid]){ return find($array, $low, $mid-1, $k); }else{ return find($array, $mid+1, $high, $k); } } die('Not have...');} //test$array = array(2,4,3,5);$n = count($array);$r = find($array,0,$n, 7、合并多个数组,不用array_merge(),题目来于论坛。 思路:遍历每个数组,重新组成一个新数组。 <?phpfunction t(){ $c = func_num_args()-1; $a = func_get_args(); //print_r($a); for($i=0; $i<=$c; $i++){ if(is_array($a[$i])){ for($j=0; $j<count($a[$i]); $j++){ $r[] = $a[$i][$j]; } } else { die('Not a array!'); } } return $r;} //testprint_r(t(range(1,4),range(1,4),range(1,4)));echo '<br/>';$a = array_merge(range(1,4),range(1,4),range(1,4));print_r($a); 8、牛年求牛:有一母牛,到4岁可生育,每年一头,所生均是一样的母牛,到15岁绝育,不再能生,20岁死亡,问n年后有多少头牛。(来自论坛) <?phpfunction t($n) { static $num = 1 for($j=1; $j<=$n; $j++){ if($j>=4 && $j<15) {$num++;t($n-$j);} if($j==20){$num--;} } return $num;} //testecho t(8);
PHP中,常用的数据结构和算法如下: 数据结构: 1. 数组(Array):一种有序的数据集合,可以通过索引或关联键访问元素。 2. 链表(Linked List):由节点组成的数据结构,每个节点存储数据和指向下一个节点的指针。 3. 栈(Stack):一种后进先出(LIFO)的数据结构,只允许在栈顶进行插入和删除操作。 4. 队列(Queue):一种先进先出(FIFO)的数据结构,允许在队尾进行插入操作,在队头进行删除操作。 5. 哈希表(Hash Table):根据关键字直接访问内存中存储的值,通过哈希函数将关键字映射到数组索引。 算法: 1. 排序算法:如冒泡排序、选择排序、插入排序、快速排序、归并排序等。 2. 搜索算法:如线性搜索、二分搜索等。 3. 图算法:如深度优先搜索(DFS)、广度优先搜索(BFS)、最短路径算法(Dijkstra算法、Floyd-Warshall算法)、最小生成树算法(Prim算法、Kruskal算法)等。 4. 动态规划(Dynamic Programming):通过将问题分解为子问题,并保存子问题的解来解决复杂问题。 5. 贪心算法(Greedy Algorithm):每一步选择当前状态下最优的解,以期望达到全局最优解。 6. 回溯算法(Backtracking):通过尝试所有可能的解,并逐步构建可行解的方式来求解问题。 这些数据结构和算法PHP开发中被广泛应用,用于解决各种问题并提高程序的效率和性能。你可以使用PHP内置的数据结构和算法实现,或者使用第三方库和组件来简化开发过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值