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 相关文章推荐
由php if 想到的些问题
Mar 22 PHP
php文件怎么打开 如何执行php文件
Dec 21 PHP
php计算数组不为空元素个数的方法
Jan 27 PHP
浅谈php扩展imagick
Jun 02 PHP
php异步多线程swoole用法实例
Nov 14 PHP
php中getservbyport与getservbyname函数用法实例
Nov 18 PHP
在Mac OS上编译安装Nginx+PHP+MariaDB开发环境的教程
Feb 23 PHP
Smarty日期时间操作方法示例
Nov 15 PHP
PHP MYSQL简易交互式站点开发
Dec 27 PHP
php微信开发之关注事件
Jun 14 PHP
php使用array_chunk函数将一个数组分割成多个数组
Dec 05 PHP
基于PHP实现邮箱验证激活过程详解
Oct 28 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
PHP小程序自动提交到自助友情连接
2009/11/24 PHP
PHP var_dump遍历对象属性的函数与应用代码
2010/06/04 PHP
Zend Studio (eclipse)使用速度优化方法
2011/03/23 PHP
深入PHP magic quotes的详解
2013/06/17 PHP
WordPress中登陆后关闭登陆页面及设置用户不可见栏目
2015/12/31 PHP
javascript取消文本选定的实现代码
2010/11/14 Javascript
jQuery异步加载数据并添加事件示例
2014/08/24 Javascript
一个不错的仿携程自定义数据下拉选择select
2014/09/01 Javascript
js+css实现超简洁的二级下拉菜单效果代码
2015/09/07 Javascript
window.onload使用指南
2015/09/13 Javascript
WEB前端实现裁剪上传图片功能
2016/10/17 Javascript
JS操作input标签属性checkbox全选的实现代码
2017/03/02 Javascript
jQuery动态产生select option下拉列表
2017/03/15 Javascript
详解cordova打包成webapp的方法
2017/10/18 Javascript
通过JavaScript下载文件到本地的方法(单文件)
2019/03/17 Javascript
vue+element树组件 实现树懒加载的过程详解
2019/10/21 Javascript
如何基于filter实现网站整体变灰功能
2020/04/17 Javascript
[04:44]DOTA2西游记战队视频彩蛋流出 师徒开黑巧遇林书豪
2016/08/03 DOTA
[49:18]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 OG vs TNC
2018/04/01 DOTA
python检测是文件还是目录的方法
2015/07/03 Python
python之Character string(实例讲解)
2017/09/25 Python
python opencv实现证件照换底功能
2019/08/19 Python
Python使用Pandas库常见操作详解
2020/01/16 Python
Python 在 VSCode 中使用 IPython Kernel 的方法详解
2020/09/05 Python
python绘制分布折线图的示例
2020/09/24 Python
巴西家用小家电购物网站:Polishop
2016/08/07 全球购物
美国电子产品主要品牌的授权在线零售商:DataVision
2019/03/23 全球购物
3个CCIE对一个工程师的面试题
2012/05/06 面试题
品管员岗位职责
2013/11/10 职场文书
2014年迎新年活动方案
2014/02/19 职场文书
健康家庭事迹材料
2014/05/02 职场文书
篝火晚会策划方案
2014/05/16 职场文书
横幅标语大全
2014/06/17 职场文书
青年文明号口号
2014/06/17 职场文书
早上好问候语大全
2015/11/10 职场文书
Python OpenCV 图像平移的实现示例
2021/06/04 Python