PHP四种基本排序算法示例


Posted in PHP onApril 09, 2015

许多人都说算法是程序的核心,算法的好坏决定了程序的质量。作为一个初级phper,虽然很少接触到算法方面的东西。但是对于基本的排序算法还是应该掌握的,它是程序开发的必备工具。这里介绍冒泡排序,插入排序,选择排序,快速排序四种基本算法,分析一下算法的思路。

前提:分别用冒泡排序法,快速排序法,选择排序法,插入排序法将下面数组中的值按照从小到大的顺序进行排序。

$arr(1,43,54,62,21,66,32,78,36,76,39);

1. 冒泡排序

思路分析:在要排序的一组数中,对当前还未排好的序列,从前往后对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即,每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。

代码实现:

$arr=array(1,43,54,62,21,66,32,78,36,76,39); 
function bubbleSort($arr)
{ 
 $len=count($arr);
 //该层循环控制 需要冒泡的轮数
 for($i=1;$i<$len;$i++)
 { //该层循环用来控制每轮 冒出一个数 需要比较的次数
 for($k=0;$k<$len-$i;$k++)
 {
  if($arr[$k]>$arr[$k+1])
  {
   $tmp=$arr[$k+1];
   $arr[$k+1]=$arr[$k];
   $arr[$k]=$tmp;
  }
 }
 }
 return $arr;
}

2. 选择排序

思路分析:在要排序的一组数中,选出最小的一个数与第一个位置的数交换。然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。

代码实现:

function selectSort($arr) {
//双重循环完成,外层控制轮数,内层控制比较次数
 $len=count($arr);
 for($i=0; $i<$len-1; $i++) {
 //先假设最小的值的位置
 $p = $i;
 for($j=$i+1; $j<$len; $j++) {
  //$arr[$p] 是当前已知的最小值
  if($arr[$p] > $arr[$j]) {
  //比较,发现更小的,记录下最小值的位置;并且在下次比较时采用已知的最小值进行比较。
  $p = $j;
  }
 }
 //已经确定了当前的最小值的位置,保存到$p中。如果发现最小值的位置与当前假设的位置$i不同,则位置互换即可。
 if($p != $i) {
  $tmp = $arr[$p];
  $arr[$p] = $arr[$i];
  $arr[$i] = $tmp;
 }
 }
 //返回最终结果
 return $arr;
}

3.插入排序

思路分析:在要排序的一组数中,假设前面的数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。

代码实现:

function insertSort($arr) {
 $len=count($arr); 
 for($i=1, $i<$len; $i++) {
 $tmp = $arr[$i];
 //内层循环控制,比较并插入
 for($j=$i-1;$j>=0;$j--) {
  if($tmp < $arr[$j]) {
  //发现插入的元素要小,交换位置,将后边的元素与前面的元素互换
  $arr[$j+1] = $arr[$j];
  $arr[$j] = $tmp;
  } else {
  //如果碰到不需要移动的元素,由于是已经排序好是数组,则前面的就不需要再次比较了。
  break;
  }
 }
 }
 return $arr;
}

4.快速排序 

思路分析:选择一个基准元素,通常选择第一个元素或者最后一个元素。通过一趟扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素。此时基准元素在其排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分。

代码实现:

function quickSort($arr) {
 //先判断是否需要继续进行
 $length = count($arr);
 if($length <= 1) {
 return $arr;
 }
 //选择第一个元素作为基准
 $base_num = $arr[0];
 //遍历除了标尺外的所有元素,按照大小关系放入两个数组内
 //初始化两个数组
 $left_array = array(); //小于基准的
 $right_array = array(); //大于基准的
 for($i=1; $i<$length; $i++) {
 if($base_num > $arr[$i]) {
  //放入左边数组
  $left_array[] = $arr[$i];
 } else {
  //放入右边
  $right_array[] = $arr[$i];
 }
 }
 //再分别对左边和右边的数组进行相同的排序处理方式递归调用这个函数
 $left_array = quick_sort($left_array);
 $right_array = quick_sort($right_array);
 //合并
 return array_merge($left_array, array($base_num), $right_array);
}
PHP 相关文章推荐
PHP安全配置
Dec 06 PHP
一些使用频率比较高的php函数
Oct 03 PHP
php性能优化分析工具XDebug 大型网站调试工具
May 22 PHP
php实现批量压缩图片文件大小的脚本
Jul 04 PHP
php检测数组长度函数sizeof与count用法
Nov 17 PHP
php模仿asp Application对象在线人数统计实现方法
Jan 04 PHP
php计算整个目录大小的方法
Jun 19 PHP
PHP+jQuery翻板抽奖功能实现
Oct 19 PHP
PHP中substr_count()函数获取子字符串出现次数的方法
Jan 07 PHP
PHP实现可自定义样式的分页类
Mar 29 PHP
php opendir()列出目录下所有文件的实例代码
Oct 02 PHP
PHP实现通过CURL上传文件功能示例
May 30 PHP
Laravel 5 框架入门(三)
Apr 09 #PHP
Laravel 5 框架入门(二)构建 Pages 的管理功能
Apr 09 #PHP
Laravel 5 框架入门(一)
Apr 09 #PHP
Smarty中的注释和截断功能介绍
Apr 09 #PHP
PHP中使用hidef扩展代替define提高性能
Apr 09 #PHP
PHP JSON格式的中文显示问题解决方法
Apr 09 #PHP
Laravel 5框架学习之用户认证
Apr 09 #PHP
You might like
PHP编实现程动态图像的创建代码
2008/09/28 PHP
PHP中文件上传的一个问题
2010/09/04 PHP
PHP读取xml方法介绍
2013/01/12 PHP
在CentOS上搭建LAMP+vsftpd环境的简单指南
2015/08/01 PHP
java微信开发之上传下载多媒体文件
2016/06/24 PHP
JavaScript与函数式编程解释
2007/04/27 Javascript
js实现带圆角的两级导航菜单效果代码
2015/08/24 Javascript
JavaScript encodeURI 和encodeURIComponent
2015/12/04 Javascript
AngularJS入门教程之更多模板详解
2016/08/19 Javascript
原生JS实现-星级评分系统的简单实例
2016/08/21 Javascript
javascript容错处理代码(屏蔽js错误)
2017/01/20 Javascript
JavaScript仿微信打飞机游戏
2020/07/05 Javascript
轻松玩转BootstrapTable(后端使用SpringMVC+Hibernate)
2017/09/06 Javascript
vue element-ui table表格滚动加载方法
2018/03/02 Javascript
详解ES6中的Map与Set集合
2019/03/22 Javascript
在vue和element-ui的table中实现分页复选功能
2019/12/04 Javascript
js将日期格式转换为YYYY-MM-DD HH:MM:SS
2020/09/18 Javascript
Python创建xml的方法
2015/03/10 Python
初步探究Python程序的执行原理
2015/04/11 Python
python对excel文档去重及求和的实例
2018/04/18 Python
使用Python+wxpy 找出微信里把你删除的好友实例
2019/02/21 Python
python2 中 unicode 和 str 之间的转换及与python3 str 的区别
2019/07/25 Python
python生成器/yield协程/gevent写简单的图片下载器功能示例
2019/10/28 Python
python实现计算器功能
2019/10/31 Python
canvas 基础之图像处理的使用
2020/04/10 HTML / CSS
StubHub新西兰:购买和出售你的门票
2019/04/22 全球购物
软件设计的目标是什么
2016/12/04 面试题
园林设计师自荐信
2013/11/18 职场文书
桥梁工程专业求职信
2014/04/21 职场文书
委托书怎样写
2014/08/30 职场文书
信访维稳工作汇报
2014/10/27 职场文书
国家助学金感谢信
2015/01/21 职场文书
英语专业毕业论文答辩开场白
2015/05/27 职场文书
python-opencv 中值滤波{cv2.medianBlur(src, ksize)}的用法
2021/06/05 Python
Java基础——Map集合
2022/04/01 Java/Android
Java异常体系非正常停止和分类
2022/06/14 Java/Android