当前位置: 首页 > 后端技术 > PHP

PHP算法——四种基本算法

时间:2023-03-30 03:06:01 PHP

前言对于大多数业务开发来说,很少需要自己实现数据结构和算法,都是利用封装好的现成接口和类库来推测和翻译业务逻辑。但是,您不需要自己实现它,这并不意味着您不需要了解任何东西。如果不了解这些库背后的原理,不了解时间和空间复杂度分析,怎么能用好并正确使用它们呢?在存储某些业务数据时,如何知道是使用ArrayList还是LinkedList?调用某个函数后,如何评估代码的性能和资源消耗?作为一名基础设施研发工程师,写出一个达到开源级别的框架就是你的目标!太深奥的算法就不说了。我觉得还是需要掌握PHP的冒泡排序、选择排序、插入排序、快速排序这四种基本算法。冒泡排序介绍:冒泡排序(BubbleSort,台湾翻译:冒泡排序或冒泡排序)是一种简单的排序算法。它反复访问待排序的序列,依次比较两个元素,如果顺序不对就交换它们。重复访问序列的工作,直到不需要交换,即序列已经排序。这个算法的名字来源于这样一个事实,即较小的元素会通过交换慢慢“浮”到序列的顶部。步骤:(1)比较相邻元素。如果第一个大于第二个,则交换它们。(2)对每一对相邻的元素做同样的事情,从开始的第一对到最后的最后一对。此时,最后一个元素应该是最大的数。(3)对除最后一个元素外的所有元素重复上述步骤。(4)每次对越来越少的元素不断重复上述步骤,直到没有一对数字可以比较。代码示例://大数在前,小数在后publicfunctionbubbleSort($arr){$len=count($arr);//这个循环控制冒泡轮次for($i=1;$i<$len;$i++){//这个循环用来控制一个数在每一轮需要比较的次数for($j=0;$j<$len-$i;$j++){//把小于号换成大于号,小数在前,大数在后if($arr[$j]<$arr[$j+1]){列表($arr[$j+1],$arr[$j])=[$arr[$j],$arr[$j+1]];}}}返回$arr;}输出结果://调用$arr=array(5,2,8,1,9);$bubbleSort=$this->bubbleSort($arr);print_r($bubbleSort);die;//输出数组([0]=>9[1]=>8[2]=>5[3]=>2[4]=>1)选择排序介绍:选择排序是在冒泡排序的基础上改进的,每次遍历链表只进行一次pass交换。简单的说,选择排序的原理就是每次从待排序的数据元素中选择最小(或最大)的元素,存放在序列的起始位置,直到所有待排序的数据元素都排完为止.选择排序是一种不稳定的排序方法。步骤:(1)先假设最小值的位置。(2)将当前假设的值与剩余元素进行比较。(3)比较,找出较小的,记录最小的位置;并且在接下来的比较中,使用已知的最小值进行最多的比较。(4)如果发现最小值的位置与当前假设的最小值的位置不同,则交换位置。反之,如果假设为真,则保留当前位置,继续查找,直到排序完成。代码示例://小数在前,大数在后//实现思路双循环完成,外层控制循环次数,当前最小值。内层控制的比较次数publicfunctionselectSort($arr){$len=count($arr);for($i=0;$i<$len-1;$i++){//先假设最小值的位置$q=$i;//哪些元素需要与($i之后)进行比较for($j=$i+1;$j<$len;$j++){//$arr[$q]是当前已知的最小值if($arr[$q]>$arr[$j]){//比较,找小的,记录最小的位置;并使用已知的最小值进行下一次比较Compare$q=$j;}}//如果发现最小值的位置与当前假设位置的$i不同,则交换位置if($q!=$i){list($arr[$i],$arr[$q])=[$arr[$q],$arr[$i]];}}返回$arr;}输出结果://调用$arr=array(5,2,8,1,9);$selectSort=$this->selectSort($arr);print_r($selectSort);die;//输出数组([0]=>1[1]=>2[2]=>5[3]=>8[4]=>9)插入排序介绍:插入排序是一种逻辑上非常容易理解的排序方法,是整个排序的核心就是不断的在已经排好一些数据的数组中寻找合适的位置插入新的数据,就像抓扑克牌一样,抓一张牌,然后找个位置插入手上已经排好的一些牌。步骤:(1)从第一个元素开始,可以认为已经排序(2)取出下一个元素,在已排序的元素序列中从后往前扫描(3)如果元素(已排序)大于New元素,将元素移动到下一个位置(4)重复步骤3,直到找到排序后的元素小于等于新元素的位置(5)将新元素插入到该位置(6)重复步骤2代码示例://小数在前,大数在后publicfunctioninsertSort($arr){$len=count($arr);//第一个元素可以认为是排序的for($i=1;$i<$len;$i++){//获取当前要比较的元素值$tmp=$arr[$i];for($j=$i-1;$j>=0;$j--){//$tmp要插入的元素$arr[$j]要比较的元素if($arr[$j]>$tmp){//发现当前插入的元素较小,交换位置list($arr[$j],$arr[$j+1])=[$arr[$j+1],$arr[$j]];}}}返回$arr;}输出结果://调用$arr=array(5,2,8,1,9);$insertSort=$this->insertSort($arr);print_r($insertSort);die;//输出数组([0]=>1[1]=>2[2]=>5[3]=>8[4]=>9)快速排序简介:快速排序是由TonyHall开发的一种排序算法。平均而言,排序n个项目需要O(nlogn)次比较。在最坏的情况下需要进行O(n2)次比较,但这并不常见。事实上,快速排序通常比其他OO(nlogn)算法快得多,因为它的内部循环可以在大多数架构和大多数真实世界数据上有效地实现,它可以决定设计选择,减少二次项的可能性在规定的时间内。通过设置一个初始中间值,将待排序数组分为三部分,左边小于中间值,中间值大于中间值右边,递归继续对左边排序和右侧以同样的方式,最后合并数组。步骤:从数组中选取一个元素,称为“pivot”,对数组重新排序,所有小于pivot值的元素都放在pivot前面,所有大于pivot值的元素都放在pivot后面(相同数可以去任何一边)。此分区退出后,基准测试位于序列的中间。这称为分区操作。对元素小于基值的子数组和元素大于基值的子数组进行递归排序。代码示例://小数在前,大数在后publicfunctionquickSort($arr){//判断参数是否为数组if(!is_array($arr))returnfalse;//递归退出:数组长度为1,直接返回数组$len=count($arr);如果($len<=1)返回$arr;//如果有多个数组元素,定义两个空数组$left=$right=[];//使用for循环遍历,取第一个元素作为比较对象for($i=1;$i<$len;$i++){//判断当前元素的大小if($arr[$i]>$arr[0]){$right[]=$arr[$i];}else{$left[]=$arr[$i];}}//递归调用$left=$this->quickSort($left);$right=$this->quickSort($right);//合并所有结果returnarray_merge($left,[$arr[0]],$right);}输出结果://call$arr=array(5,2,8,1,9);$quickSort=$this->quickSort($arr);print_r($quickSort);die;//输出数组([0]=>1[1]=>2[2]=>5[3]=>8[4]=>9)适用场景通过对算法时间复杂度和空间复杂度的对比分析,得出四种算法最佳适用场景的稳定性:即排序后具有相同key值的元素的相对位置保持不变.点击详细解释注释:n是问题的规模,大写英文字母O是算法的复杂度。冒泡排序:当n问题规模较小时,适用于对键值相同的元素相对位置进行排序且相对位置不变的情况。选择排序:当n个问题的规模较小时,适用于排序后原始key值相同的元素相对位置保持不变的情况。插入排序:适用于大部分已经排序的情况。快速排序:当n问题规模较大时,适用于不要求排序后具有相同key值的元素的相对位置保持不变的情况。相关资料PHP四种基本算法算法时间复杂度和空间复杂度详解-总结程序员普遍缺乏数据结构和算法知识?你怎么认为?