PHP四种排序算法实现及效率分析【冒泡排序,插入排序,选择排序和快速排序】


Posted in PHP onApril 27, 2018

本文实例讲述了PHP四种排序算法实现及效率分析。分享给大家供大家参考,具体如下:

PHP的四种基本排序算法为:冒泡排序、插入排序、选择排序和快速排序。

下面是我整理出来的算法代码:

1. 冒泡排序:

思路:对数组进行多轮冒泡,每一轮对数组中的元素两两比较,调整位置,冒出一个最大的数来。

//简单版:
function bubbleSort($arr)
{
   $n = count($arr);
   for($i=1;$i<$n;$i++) { //冒泡的轮数(最多$n-1轮)
     for($j=0;$j<$n-1;$j++) { //每一轮冒泡(两两比较,大者后移)
       if($arr[$j] > $arr[$j+1]) { //前者大于后者,交换位置
          $tmp = $arr[$j];
          $arr[$j] = $arr[$j+1];
          $arr[$j+1] = $tmp;
       }
     }
   }
   return $arr;
}
//改进版:
function bubbleSort($arr)
{
   $n = count($arr);
   for($i=1;$i<$n;$i++) { //冒泡的轮数(最多$n-1轮)
     $flag = 0;  //是否发生位置交换的标志
     for($j=0;$j<$n-$i;$j++) { //每一轮冒泡(两两比较,大者后移)
       if($arr[$j] > $arr[$j+1]) { //前者大于后者,交换位置
          $tmp = $arr[$j];
          $arr[$j] = $arr[$j+1];
          $arr[$j+1] = $tmp;
          $flag = 1;
       }
     }
     if($flag == 0) {  //没有发生位置交换,排序已完成
       break;
     }
   }
   return $arr;
}

为了提高冒泡排序算法的效率,主要需要改进的地方有:

(1)减少冒泡的轮数:当一轮冒泡排序中没有发生位置交换时表示数组已排好序了,应立即退出循环。

(2)减少每一轮比较的次数:对数组中已经排好序的部分元素不再对它们进行比较。

2. 插入排序:

思路:假设数组前面的元素是排好序的,遍历数组后面的元素,在已排好序的元素队列中找到合适的位置,插入其中。

function insertSort($arr)
{
   $n = count($arr);
   for($i=1;$i<$n;$i++) { //从第二个元素开始插入
     for($j=$i-1;$j>=0;$j--) { //与前面的数比较,找到插入的位置
       if($arr[$j] > $arr[$j+1]) { //比前面的数小,交换位置
          $tmp = $arr[$j];
          $arr[$j] = $arr[$j+1];
          $arr[$j+1] = $tmp;
       } else { //大于或等于前面的数,表示已找到插入的位置
          break;
       }
     }
   }
   return $arr;
}

3. 选择排序:

思路:进行多次选择,每次选出最大元素放入指定位置。

function selectSort($arr)
{
   $n = count($arr);
   for($i=$n-1;$i>0;$i--) { //选择排序的轮数($n-1轮)
     $pos = $i; //假设最大元素的位置
     for($j=0;$j<$i;$j++) { //每一轮:从未选择过的元素中选择最大的数
       if($arr[$j] > $arr[$pos]) { //所在位置元素比目前最大元素大,标志其位置
          $pos = $j;
       }
     }
     if($pos != $i) { //将最大元素放入指定的位置
       $tmp = $arr[$pos];
       $arr[$pos] = $arr[$i];
       $arr[$i] = $tmp;
     }
   }
   return $arr;
}

4. 快速排序:

思路:递归算法。先选择数组的第一个元素作为标准,然后把小于或等于它和大于它的数分别放入两个数组中,对这两个数组也进行相同的处理,最后合并这两个数组和第一个元素。

function quickSort($arr)
{
   $n = count($arr);
   if($n <= 1) { //若数组只有一个元素,直接返回
     return $arr;
   }
   $largeArr = array(); //存放大数
  $smallArr = array(); //存放小数
   $cur = $arr[0];  //分类基数
   for($i=1;$i<$n;$i++) { //遍历数组元素,对每个元素进行归类
     if($arr[$i] > $cur) {
       $largeArr[] = $arr[$i];
     } else {
       $smallArr[] = $arr[$i];
     }
   }
   //分别对大数组和小数组进行相同的处理
   $smallArr = quickSort($smallArr);
   $largeArr = quickSort($largeArr);
   //合并小数组、分类基数和大数组
   return array_merge($smallArr,array($cur),$largeArr);
}

各个排序算法的时间复杂度和空间复杂度:

排序算法 最好时间分析 最差时间分析 平均时间复杂度 稳定度 空间复杂度
冒泡排序 O(n) O(n2) O(n2) 稳定 O(1)
插入排序 O(n) O(n2) O(n2) 稳定 O(1)
选择排序 O(n2) O(n2) O(n2) 稳定 O(1)
快速排序 O(nlog2n) O(n2) O(nlog2n) 不稳定 O(log2n)~O(n)

注:快速排序在数组乱序是效率是最好的,在数组有序时效率是最差的。

PHP 相关文章推荐
967 个函式
Oct 09 PHP
jQuery 源码分析笔记
May 25 PHP
php中使用addslashes函数报错问题的解决方法
Feb 06 PHP
模板引擎smarty工作原理以及使用示例
May 25 PHP
ThinkPHP使用smarty模板引擎的方法
Jul 01 PHP
PHP实现HTML生成PDF文件的方法
Nov 07 PHP
php使用GD创建保持宽高比缩略图的方法
Apr 17 PHP
Laravel的throttle中间件失效问题解决方法
Oct 09 PHP
PHP 接入微信扫码支付总结(总结篇)
Nov 03 PHP
PHP实现给定一列字符,生成指定长度的所有可能组合示例
Jun 22 PHP
Laravel 模型使用软删除-左连接查询-表起别名示例
Oct 24 PHP
php高性能日志系统 seaslog 的安装与使用方法分析
Feb 29 PHP
php-fpm服务启动脚本的方法
Apr 27 #PHP
php-fpm添加service服务的例子
Apr 27 #PHP
laravel 5.4 + vue + vux + element的环境搭配过程介绍
Apr 26 #PHP
PHP分享图片的生成方法
Apr 25 #PHP
PHP receiveMail实现收邮件功能
Apr 25 #PHP
laravel中短信发送验证码的实现方法
Apr 25 #PHP
PHP设计模式之适配器模式原理与用法分析
Apr 25 #PHP
You might like
各种战术和打法的原创者
2020/03/04 星际争霸
php学习笔记 类的声明与对象实例化
2011/06/13 PHP
php站内搜索并高亮显示关键字的实现代码
2011/12/29 PHP
ThinkPHP实现带验证码的文件上传功能实例
2014/11/01 PHP
Yii 2中的load()和save()示例详解
2017/08/03 PHP
PHP获取星期几的常用方法小结
2018/12/18 PHP
IE不出现Flash激活框的小发现的js实现方法
2007/09/07 Javascript
JQuery入门——事件切换之toggle()方法应用介绍
2013/02/05 Javascript
Node.js编码规范
2014/07/14 Javascript
JS根据生日算年龄的方法
2015/05/05 Javascript
javascript实现图片延迟加载方法汇总(三种方法)
2015/08/27 Javascript
jQuery往返城市和日期查询实例讲解
2015/10/09 Javascript
node-http-proxy修改响应结果实例代码
2016/06/06 Javascript
微信小程序 获取当前地理位置和经纬度实例代码
2016/12/05 Javascript
jquery实现表单获取短信验证码代码
2017/03/13 Javascript
vue微信分享出来的链接点开是首页问题的解决方法
2018/11/28 Javascript
javascript实现图片轮播代码
2019/07/09 Javascript
vue 组件间的通信之子组件向父组件传值的方式
2020/07/29 Javascript
pycharm 使用心得(四)显示行号
2014/06/05 Python
python实现通过pil模块对图片格式进行转换的方法
2015/03/24 Python
浅析使用Python操作文件
2017/07/31 Python
使用python对文件中的数值进行累加的实例
2018/11/28 Python
Python实现桌面翻译工具【新手必学】
2020/02/12 Python
如何对python的字典进行排序
2020/06/19 Python
俄罗斯最大的在线珠宝大卖场:Nebo
2019/12/08 全球购物
Myprotein比利时官方网站:欧洲第一运动营养品牌
2020/10/04 全球购物
工商管理实习生自我鉴定范文
2013/12/18 职场文书
离婚财产分隔协议书
2014/10/23 职场文书
六年级学生期末评语
2014/12/26 职场文书
考研英语复习计划
2015/01/19 职场文书
因工资原因离职的辞职信范文
2015/05/12 职场文书
运动会入场词
2015/07/18 职场文书
庆七一活动简报
2015/07/20 职场文书
《鲁滨逊漂流记》之六读后感(4篇)
2019/09/29 职场文书
利用JuiceFS使MySQL 备份验证性能提升 10 倍
2022/03/17 MySQL
Java存储没有重复元素的数组
2022/04/29 Java/Android