八大基本算法思想及实现-php实现

递推算法
<?php
//递归
$f[1] = 1;
$f[2] = 1;
$des = 15;
for($i = 3; $i <= $des; $i++ ){
    $f[$i] = $f[$i - 1]+$f[$i - 2];
}
//查看
echo '<pre>';
print_r($f);

?>
递归算法
<?php
    //递归思想
//递归一定要有函数
function recursion($n){
    //递归出口
        if($n == 1 || $n == 2 ) return 1;
        return recursion($n - 1)+recursion($n - 2);
}
echo recursion(15)
?>
冒泡排序
<?php
    //冒泡排序
    $arr = array(1,4,2,9,7,5,8);
for($i=0; $i < count($arr);$i++){
    for($j=0;$j < count($arr)-1-$i;$j++){
        if($arr[$j] > $arr[$j+1]){
            $temp = $arr[$j];
            $arr[$j] = $arr[$j+1];
            $arr[$j+1] = $temp;

        }    
    }
}
    echo "<pre>";
    print_r($arr);
?>
选择排序
<?php
    $arr = array(1,5,2,9,6,3,4);
    $len = count($arr);
    for($i = 0;$i < $len;$i++){
        $min = $i;
        for($j = $i +1;$j < $len;$j++){
            if($arr[$j] < $arr[$min]){
                $min = $j;
            }
        }
        if($min != $i){
            $temp = $arr[$min];
            $arr[$min] = $arr[$i];
            $arr[$i] = $temp; 

        }
    }
    
    echo "<pre>";
    print_r($arr);
    


?>
插入排序
<?php
    //插入排序
	$arr = array(4,2,6,8,9,5);
	$len = count($arr);
	//1.确定要插入多少回(假设一个数组一次性插入到对的位置,同时对一个位置假设是对的)
	for($i = 1;$i < $len;$i++){
		//2.取出当前要插入元素的值
		$temp = $arr[$i];
		//3.让数据与前面已经排好序的数组元素重复比较(挨个比较),直到位置(交换)
		for($j = $i - 1;$j >= 0;$j--){
			//4.比较
			if($arr[$j] > $temp){
				//说明当前要插入的元素,比前面已经排好序的元素的值要小:交换位置
				$arr[$j+1] = $arr[$j];
				$arr[$j] = $temp;
			}else{
				//说明当前待插入元素,比前面元素要大:说明位置正确
				break;
			}
		}

	}
	echo '<pre>';
	print_r($arr);
	
?>
优化

//优化代码
<?php
    //插入排序
	$arr = array(4,2,6,8,9,5);
	$len = count($arr);
	//1.确定要插入多少回(假设一个数组一次性插入到对的位置,同时对一个位置假设是对的)
	for($i = 1;$i < $len;$i++){
		//2.取出当前要插入元素的值
		$temp = $arr[$i];
		//标记:默认说明当前要插入的数组位置是对的
		$change = false;
		//3.让数据与前面已经排好序的数组元素重复比较(挨个比较),直到位置(交换)
		for($j = $i - 1;$j >= 0;$j--){
			//4.比较
			if($arr[$j] > $temp){
				//说明当前要插入的元素,比前面已经排好序的元素的值要小:交换位置
				$arr[$j+1] = $arr[$j];
				//$arr[$j] = $temp;
				//说明当前顺序的数组元素有不合适的位置
				$change = true;
			}else{
				//说明当前待插入元素,比前面元素要大:说明位置正确
				break;
			}
		}
		//判断位置需要变动
		if($change){
			//有数据
			$arr[$j+1] =$temp;
		}

	}
	echo '<pre>';
	print_r($arr);
	
?>
快递排序
<?php
	//快速排序
	$arr = array(1,6,3,4,9,2,7,8);
	function QuickSort($arr){
		//递归出口
		$len = count($arr);
		if($len <= 1) return $arr;

		//取出某个元素,然后将剩余的数组元素,分散到两个不同的数组中
		$left = $right =array();
		for($i = 1;$i < $len;$i++){
			//第一个元素作为比较元素
			//小的放left中,大的放right中
			if($arr[$i] < $arr[0]){
				$left[] = $arr[$i];
			}else{
				$right[] = $arr[$i];
			}

		}
		//$left和$right数组元素没有排好序:递归点
		$left = QuickSort($left);
		$right = QuickSort($right);
		return array_merge($left,(array)$arr[0],$right);

	}
	echo '<pre>';
	print_r(QuickSort($arr));

?>
归并排序
二路归并
<?php
	//PHP数组排序算法:合并算法
	//二路归并
	$arr1 = array(1,3,5);
	$arr2 = array(2,4,6);
	//取出一个空数组用于归并空间
	$arr3 = array();
	while(count($arr1) && count($arr2)){
		//只要$arr1和$arr2里面还有元素,就进行循环
		//取出每个数组的第一个元素:进行比较
		$arr3[] = $arr1[0] < $arr2[0] ? array_shift($arr1) : array_shift($arr2);
	}
	//合并结果
	echo "<pre>";
	print_r(array_merge($arr3,$arr1,$arr2));

?>
实现

<?php
	$arr = array(4,7,2,1,5,9,3);

	//归并排序函数
	function MergeSort($arr){
		//归并出口
		$len = count($arr);
		if($len <= 1)return $arr;

		//拆分
		$middle = floor($len/2);
		$left =array_slice($arr,0,$middle);
		$right = array_slice($arr,$middle);

		//递归点:$left和$right都没有排好序,而且可能是多个元素的数组
		$left = MergeSort($left);
		$right = MergeSort($right);

		//假设左边和右边都已经排好序:二路归并
		$m = array();
		while(count($left) && count($right)){
			//只要$arr1和$arr2里面还有元素,就进行循环
			//取出每个数组的第一个元素,进行比较
			$m[] = $left[0] < $right[0] ? array_shift($left) : array_shift($right);
		}

		//返回结果
		return array_merge($m,$left,$right);
	}

	echo '<pre>';
	print_r(MergeSort($arr));
?>
查找排序
顺序查找
<?php
	//查找算法
	//顺序查找
	$arr =array(1,3,6,8,23,68,100);
	
	//顺序查找:从数组第一个元素开始,挨个匹配
	function CheckOrder($arr,$num){
		//全部匹配
		$len = count($arr);
		for($i = 0;$i < $len;$i++){
			//判断
			if($arr[$i] == $num){
				return $i;
			}
			
		}
		return false;
	}
	var_dump(CheckOrder($arr,5));

?>

二分查找


<?php
	//二分查找算法
	$arr =array(1,3,6,8,23,68,100);
	$res = 100;	
	function CheckOrder1($arr,$res){
	
		//1.得到数组边界
		$right = count($arr);
		$left = 0;

		//2.循环匹配
		while($left <= $right){
			//3.得到中间位置
			$middle =(int)floor(($right + $left)/2);

			//4.匹配数据
			if($arr[$middle] == $res){
				return $middle + 1;
			}
			//5.没有找到
			if($arr[$middle] < $res){
				//值在右边
				$left = $middle + 1;
			}else{
				//值在左边
				$right = $middle - 1; 
			}
		}
		return false;
			
	}
	var_dump(CheckOrder1($arr,$res));
?>

发布了39 篇原创文章 · 获赞 5 · 访问量 1041

猜你喜欢

转载自blog.csdn.net/qq_45206551/article/details/104726154