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 相关文章推荐
Linux下将excel数据导入到mssql数据库中的方法
Feb 08 PHP
PHP 编写大型网站问题集
May 07 PHP
解析关于java,php以及html的所有文件编码与乱码的处理方法汇总
Jun 24 PHP
php curl选项列表(超详细)
Jul 01 PHP
PHP json_decode函数详细解析
Feb 17 PHP
PHP对接微信公众平台消息接口开发流程教程
Mar 25 PHP
php+xml编程之xpath的应用实例
Jan 24 PHP
深入理解PHP内核(一)
Nov 10 PHP
jQuery向下滚动即时加载内容实现的瀑布流效果
Jan 07 PHP
解决yii2左侧菜单子级无法高亮问题的方法
May 08 PHP
PHPCMS V9 添加二级导航的思路详解
Oct 20 PHP
PHP错误提示It is not safe to rely on the system……的解决方法
Mar 25 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/12/11 PHP
PHP中使用glob函数实现一句话删除某个目录下的所有文件
2014/07/22 PHP
PHP exif扩展方法开启详解
2014/07/28 PHP
PHP实现数据分页显示的简单实例
2016/05/26 PHP
详解yii2实现分库分表的方案与思路
2017/02/03 PHP
php利用ZipArchive类操作文件的实例
2020/01/21 PHP
关于__defineGetter__ 和__defineSetter__的说明
2007/05/12 Javascript
javascript 当前日期加(天、周、月、年)
2009/08/09 Javascript
jQuery实现仿美橙互联两级导航菜单效果完整实例
2015/09/17 Javascript
javascript实现2016新年版日历
2016/01/25 Javascript
微信小程序之MaterialDesign--input组件详解
2017/02/15 Javascript
详谈for循环里面的break和continue语句
2017/07/20 Javascript
详解Angular CLI + Electron 开发环境搭建
2017/07/20 Javascript
EL表达式截取字符串的函数说明
2017/09/22 Javascript
vue-scroller记录滚动位置的示例代码
2018/01/17 Javascript
Vue CL3 配置路径别名详解
2019/05/30 Javascript
Python中的异常处理学习笔记
2015/01/28 Python
Python迭代器和生成器介绍
2015/03/06 Python
python实现指定字符串补全空格、前面填充0的方法
2018/11/16 Python
Python Unittest根据不同测试环境跳过用例的方法
2018/12/16 Python
Python发送邮件的实例代码讲解
2019/10/16 Python
python实现大战外星人小游戏实例代码
2019/12/26 Python
在Python中通过threshold创建mask方式
2020/02/19 Python
Python龙贝格法求积分实例
2020/02/29 Python
Python装饰器的应用场景代码总结
2020/04/10 Python
django 解决自定义序列化返回处理数据为null的问题
2020/05/20 Python
基于python实现破解滑动验证码过程解析
2020/05/28 Python
纯css3实现走马灯效果
2014/12/26 HTML / CSS
非常漂亮的CSS3百叶窗焦点图动画
2016/02/24 HTML / CSS
在IE6系列等老式浏览器中使用HTML5的新标签实现方案
2012/12/25 HTML / CSS
春季运动会广播稿大全
2014/02/19 职场文书
彩色的翅膀教学反思
2014/04/25 职场文书
大学生入党推荐书范文
2014/05/17 职场文书
新年寄语2016
2015/08/17 职场文书
html5调用摄像头截图功能
2022/01/18 Javascript
关于MybatisPlus配置双数据库驱动连接数据库问题
2022/01/22 Java/Android