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下判断网址是否有效的代码
Oct 08 PHP
Smarty中常用变量操作符汇总
Oct 27 PHP
php+mysqli事务控制实现银行转账实例
Jan 29 PHP
thinkphp3.2中Lite文件替换框架入口文件或应用入口文件的方法
May 21 PHP
php实现html标签闭合检测与修复方法
Jul 09 PHP
PHP加密解密函数详解
Oct 28 PHP
PHP explode()函数的几个应用和implode()函数有什么区别
Nov 05 PHP
PHP房贷计算器实例代码,等额本息,等额本金
Apr 01 PHP
理清PHP在Linxu下执行时的文件权限方法
Jun 07 PHP
PHP获取数据库表中的数据插入新的表再原删除数据方法
Oct 12 PHP
Yii框架学习笔记之应用组件操作示例
Nov 13 PHP
PHP7创建销毁session的实例方法
Feb 03 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
理解PHP5中static和const关键字的区别
2007/03/19 PHP
UTF8编码内的繁简转换的PHP类
2009/07/09 PHP
在命令行下运行PHP脚本[带参数]的方法
2010/01/22 PHP
php Smarty 字符比较代码
2011/02/27 PHP
PHP+jQuery 注册模块的改进(三):更新到Smarty3.1
2014/10/14 PHP
ThinkPHP入口文件设置及相关注意事项分析
2014/12/05 PHP
php安装swoole扩展的方法
2015/03/19 PHP
php之header的不同用法总结(实例讲解)
2017/11/28 PHP
Javascript 文件夹选择框的两种解决方案
2009/07/01 Javascript
JQuery打造PHP的AJAX表单提交实例
2009/11/03 Javascript
JavaScript DOM 学习第三章 内容表格
2010/02/19 Javascript
Jquery下判断Id是否存在的代码
2011/01/06 Javascript
详解JavaScript中setSeconds()方法的使用
2015/06/11 Javascript
nodejs初步体验篇
2015/11/23 NodeJs
深入理解JavaScript中的对象复制(Object Clone)
2016/05/18 Javascript
Angular ng-repeat遍历渲染完页面后执行其他操作详细介绍
2016/12/13 Javascript
VeeValidate在vue项目里表单校验应用案例
2018/05/09 Javascript
vue解决使用webpack打包后keep-alive不生效的方法
2018/09/01 Javascript
详解如何制作并发布一个vue的组件的npm包
2018/11/10 Javascript
新版小程序登录授权的方法
2018/12/12 Javascript
ant design vue中日期选择框混合时间选择器的用法说明
2020/10/27 Javascript
[04:51]TI10典藏宝瓶Ⅱ外观视频展示
2020/08/15 DOTA
学习Python3 Dlib19.7进行人脸面部识别
2018/01/24 Python
Django 实现Admin自动填充当前用户的示例代码
2019/11/18 Python
神经网络训练采用gpu设置的方式
2021/03/03 Python
HTML5 播放 RTSP 视频的实例代码
2019/07/29 HTML / CSS
naturalizer加拿大官网:美国娜然女鞋
2017/04/04 全球购物
意大利在线眼镜精品店:Ottica Lipari
2019/11/11 全球购物
大学生个人事迹材料
2014/01/21 职场文书
教师考核评语
2014/04/28 职场文书
离婚协议书怎么写(范本参考)
2014/09/30 职场文书
村支部书记群众路线对照检查材料思想汇报
2014/10/08 职场文书
感谢信的格式
2015/01/21 职场文书
用Python创建简易网站图文教程
2021/06/11 Python
Go语言并发编程 sync.Once
2021/10/16 Golang
Windows Server 2008 修改远程登录端口以及配置防火墙
2022/04/28 Servers