php 判断空数组-PHP算法-四种基本算法

2023-08-26 0 6,559 百度已收录

对于大多数业务开发来说,很少需要自己实现数据结构和算法。 他们使用已打包的现成套接字和类库来推断和翻译业务逻辑。 无需了解。

如果你不知道这个解释器背后的原理,不懂时间和空间复杂度的分析,怎么能用好、正确呢? 存储某个业务数据时,如何知道使用ArrayList还是LinkedList? 调用某个函数后,如何评估代码的性能和资源消耗?

作为一名基础设施研发工程师,编写一个达到开源水平的框架就是你的目标!

太深的算法就不说了。 我觉得还是需要掌握冒泡排序、选择排序、插入排序、快速排序等PHP的四种基本算法。

冒泡排序

介绍:

冒泡排序(Bubble Sort,台译:冒泡排序或冒泡排序)是一种简单的排序算法。 它反复访问要排序的数组php 判断空数组,依次比较两个元素,如果顺序错误则交换它们。 重复访问序列的工作,直到不需要交换,即序列已经排序完毕。 这个算法的名字来源于这样一个事实:较小的元素会通过交换逐渐“浮动”到序列的顶部。

步:

(1)比较相邻元素。 如果第一个比第二个大,则交换它们。

(2) 对每对相邻元素执行相同的操作,从开头的第一对到结尾的最后一对。 此时,最后一个元素应该是最大的数字。

(3) 对除最后一个元素之外的所有元素重复上述步骤。

(4) 每次对越来越少的元素继续重复前面的步骤,直到没有一对数字可供比较。

代码示例:

//大数在前,小数在后
public function bubbleSort($arr){
$len=count($arr);
//该层循环控制 需要冒泡的轮数
for($i=1;$i<$len;$i++){
//该层循环用来控制每轮 冒出一个数 需要比较的次数
for($j=0;$j<$len-$i;$j++){ //把小于号换成大于号就是,小数在前,大数在后
if($arr[$j]<$arr[$j+1]){
list($arr[$j+1],$arr[$j])=[$arr[$j],$arr[$j+1]];
}
}
}
return $arr;
}

输出结果:

//调用
$arr=array(5,2,8,1,9);
$bubbleSort=$this->bubbleSort($arr);
print_r($bubbleSort);die;

//输出
Array
(
[0] => 9
[1] => 8
[2] => 5
[3] => 2
[4] => 1
)

选择排序

介绍:

选择排序在冒泡排序的基础上进行了改进php 判断空数组,每次遍历列表时仅进行一次传递交换。 简单来说,选择排序的原理就是每次从待排序的数据元素中选择最小(或最大)的元素,将其存放在序列的起始位置,直到所有待排序的数据元素都排完为止。 选择排序是一种不稳定的排序方法。

步:

(1) 首先假设最小值的位置。

(2) 将当前假定值与剩余元素进行比较。

(3)比较,找出较小的,记录最小的位置; 并使用上次比较时已知的最小值进行比较。

(4)如果发现最小值的位置与当前假定的最小值的位置不同,则交换位置。 相反,如果假设成立,则保留当前位置并继续搜索,直到排序完成。

代码示例:

//小数在前,大数在后
//实现思路 双重循环完成,外层控制轮数,当前的最小值。内层 控制的比较次数
public function selectSort($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]){
//比较,发现更小的,记录下最小的位置;并在下次比较的时候,采用已知的最小值最比较
$q=$j;
}
}
//如果发现,最小值的位置与当前假设的位置的$i不同,则位置互换
if($q!=$i){
list($arr[$i],$arr[$q])=[$arr[$q],$arr[$i]];
}
}
return $arr;
}

输出结果:

//调用
$arr=array(5,2,8,1,9);
$selectSort=$this->selectSort($arr);
print_r($selectSort);die;

//输出
Array
(
[0] => 1
[1] => 2
[2] => 5
[3] => 8
[4] => 9
)

插入排序

介绍:

插入排序是一种逻辑上非常容易理解的排序方法。 整个排序的核心就是在已经排好一些数据的字段中不断寻找合适的位置插入新的数据。 就像抓一张扑克牌,抓一张,然后插到手上已经排序好的一些牌的位置上。

步:

(1) 从第一个元素开始,可以认为该元素已经排序

(2)取出下一个元素,在已经排好序的元素序列中从后向前扫描

(3) 如果元素(已排序)大于新元素,则将该元素移动到下一个位置

(4) 重复步骤3,直到找到已排序元素大于等于新元素的位置

(5) 将新元素插入到该位置

(6)重复步骤2

代码示例:

//小数在前,大数在后
public function insertSort($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]];
}
}
}
return $arr;
}

输出结果:

//调用
$arr=array(5,2,8,1,9);
$insertSort=$this->insertSort($arr);
print_r($insertSort);die;

//输出
Array
(
[0] => 1
[1] => 2
[2] => 5
[3] => 8
[4] => 9
)

快速排序

介绍:

快速排序是由 Tony Hall 开发的一种排序算法。 平均而言,对 n 个项目进行排序需要 O(n log n) 次比较。 最坏的情况下需要 O(n2) 次比较,但这些情况并不常见。 事实上,快速排序通常比其他 Ο(n log n) 算法快得多,因为它的内部循环可以在大多数架构和大多数现实世界数据上高效实现,这可以确定设计选择,减少二次项的可能性在规定的时间内。

通过设置一个初始中间值,将待排序的字段分为3部分,小于中间值的一侧、中间值、大于中间值的一侧,继续递归地用同样的方法对左边和右边进行排序右侧,最后合并字段。

步:

从序列中选择一个元素,称为“枢轴”,

对数组重新排序,所有小于基准值的元素都放在基准上,所有大于基准值的元素都放在基准旁边(相同的数字可以走任意一边)。 分区退出后,数据位于序列的中间。 这称为分区操作。

对大于基值的元素子数组和小于基值的元素子数组进行递归排序。

代码示例:

//小数在前,大数在后
public function quickSort($arr)
{
//判断参数是否是一个数组
if(!is_array($arr)) return false;
//递归出口:数组长度为1,直接返回数组
$len=count($arr);
if($len <= 1) return $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);
//将所有的结果合并
return array_merge($left,[$arr[0]],$right);
}

输出结果:

//调用
$arr=array(5,2,8,1,9);
$quickSort=$this->quickSort($arr);
print_r($quickSort);die;

//输出
Array
(
[0] => 1
[1] => 2
[2] => 5
[3] => 8
[4] => 9
)

适用场景

通过算法时间复杂度和空间复杂度的对比分析,得出四种算法的最佳适用场景。

稳定性:指原本与通配符相同的元素在排序后相对位置不会改变。点击查看详细解释

注:n为问题的规模,大写英文字母O为算法的复杂度。

冒泡排序:当n问题规模较小时,适用于与前面通配符相同的元素相对位置排序且要求较高的情况。

选择排序:当n问题规模较小时,不要求与前面通配符相同的元素在排序后相对位置不变。

插入排序:适用于大部分已经排序的情况。

快速排序:当n问题规模较大时,对于与前面要排序的通配符相同的元素的相对位置没有要求的情况下适用。

以上内容希望对您有所帮助。 1年以上PHPer可以添加下面二维码进群交流,学习PHP高级技术。

如果你想和PHP高手交流,加Momo,拉你进群

如果你想获取学习视频,添加Momo,给你发资源

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 php php 判断空数组-PHP算法-四种基本算法 https://www.wkzy.net/game/158618.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务