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 相关文章推荐
如何限制访问者的ip(PHPBB的代码)
Oct 09 PHP
php中防止伪造跨站请求的小招式
Sep 02 PHP
PHP实现时间轴函数代码
Oct 08 PHP
yii操作cookie实例简介
Jul 09 PHP
laravel安装和配置教程
Oct 29 PHP
PHP中array_slice函数用法实例详解
Nov 25 PHP
php中的动态调用实例分析
Jan 07 PHP
php短址转换实现方法
Feb 25 PHP
php字符串按照单词进行反转的方法
Mar 14 PHP
一个简单安全的PHP验证码类 附调用方法
Jun 24 PHP
php 与 nginx 的处理方式及nginx与php-fpm通信的两种方式
Sep 28 PHP
Laravel 6.2 中添加了可调用容器对象的方法
Oct 22 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
粗略计算在线时间,bug:ip相同
2006/12/09 PHP
php 8小时时间差的解决方法小结
2009/12/22 PHP
解析php中如何调用用户自定义函数
2013/08/06 PHP
PHP字符串的递增和递减示例介绍
2014/02/11 PHP
thinkphp备份数据库的方法分享
2015/01/04 PHP
PHP那些琐碎的知识点(整理)
2017/05/20 PHP
Laravel Validator自定义错误返回提示消息并在前端展示
2019/05/09 PHP
JavaScript动态添加列的方法
2015/03/25 Javascript
jQuery实现左右切换焦点图
2015/04/03 Javascript
jQuery实现动态添加和删除一个div
2015/08/12 Javascript
JavaScript中push(),join() 函数 实例详解
2016/09/06 Javascript
Jquery UI实现一次拖拽多个选中的元素操作
2020/12/01 Javascript
angularjs点击图片放大实现上传图片预览
2017/02/24 Javascript
js自定义input文件上传样式
2018/10/26 Javascript
vue+element模态框中新增模态框和删除功能
2019/06/11 Javascript
解决vue与node模版引擎的渲染标记{{}}(双花括号)冲突问题
2020/09/11 Javascript
[01:38]DOTA2辉夜杯 欢乐的观众现场采访
2015/12/26 DOTA
Python实现模拟登录及表单提交的方法
2015/07/25 Python
Python自动化部署工具Fabric的简单上手指南
2016/04/19 Python
完美解决Python 2.7不能正常使用pip install的问题
2018/06/12 Python
python 在sql语句中使用%s,%d,%f说明
2020/06/06 Python
Python 列表中的修改、添加和删除元素的实现
2020/06/11 Python
python实现mask矩阵示例(根据列表所给元素)
2020/07/30 Python
HTML5+JS实现俄罗斯方块原理及具体步骤
2013/11/29 HTML / CSS
美国电视购物:QVC
2017/02/06 全球购物
美国高级音响品牌:Master&Dynamic
2018/07/05 全球购物
物业经理求职自我评价
2013/09/22 职场文书
三年级数学教学反思
2014/01/31 职场文书
闭幕式主持词
2014/04/02 职场文书
项目采购员岗位职责
2014/04/15 职场文书
软件售后服务方案
2014/05/29 职场文书
2015年个人工作总结报告
2015/04/25 职场文书
详解使用 CSS prefers-* 规范提升网站的可访问性与健壮性
2021/05/25 HTML / CSS
Python3接口性能测试实例代码
2021/06/20 Python
SpringBoot集成Druid连接池连接MySQL8.0.11
2021/07/02 Java/Android
Flink 侧流输出源码示例解析
2022/09/23 Servers