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 相关文章推荐
DOMXML函数笔记
Oct 09 PHP
php分页示例代码
Mar 19 PHP
首页四格,首页五格For6.0(GBK)(UTF-8)[12种组合][9-18][版主安装测试通过]
Sep 24 PHP
php mssql 数据库分页SQL语句
Dec 16 PHP
php imagecreatetruecolor 创建高清和透明图片代码小结
May 15 PHP
ThinkPHP之M方法实例详解
Jun 20 PHP
smarty内置函数foreach用法实例
Jan 22 PHP
php自定义分页类完整实例
Dec 25 PHP
redis查看连接数及php模拟并发创建redis连接的方法
Dec 15 PHP
thinkphp整合系列之极验滑动验证码geetest功能
Jun 18 PHP
Laravel第三方包报class not found的解决方法
Oct 13 PHP
50个优秀经典PHP算法大集合 附源码
Aug 26 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
Flash空降上海 化身大魔王接受挑战
2020/03/02 星际争霸
PHP5中MVC结构学习
2006/10/09 PHP
利用文件属性结合Session实现在线人数统计
2006/10/09 PHP
PHP array操作10个小技巧分享
2011/06/23 PHP
解析PHP处理换行符的问题 \r\n
2013/06/13 PHP
php定界符
2014/06/19 PHP
JavaScript 获取用户客户端操作系统版本
2009/08/25 Javascript
javascript页面上使用动态时间具体实现
2014/03/18 Javascript
jQuery中ScrollTo用法示例
2016/09/04 Javascript
js+div+css下拉导航菜单完整代码分享
2016/12/28 Javascript
Angular.js中定时器循环的3种方法总结
2017/04/27 Javascript
JavaScript实现简单图片轮播效果
2017/08/21 Javascript
详解Webpack实战之构建 Electron 应用
2017/12/25 Javascript
p5.js入门教程之平滑过渡(Easing)
2018/03/16 Javascript
js中火星坐标、百度坐标、WGS84坐标转换实现方法示例
2020/03/02 Javascript
[01:30]2016国际邀请赛中国区预选赛神秘商店火爆开启
2016/06/26 DOTA
使用Python脚本对Linux服务器进行监控的教程
2015/04/02 Python
Python的ORM框架中SQLAlchemy库的查询操作的教程
2015/04/25 Python
Python实现读写INI配置文件的方法示例
2018/06/09 Python
解决py2exe打包后,总是多显示一个DOS黑色窗口的问题
2019/06/21 Python
Django-Model数据库操作(增删改查、连表结构)详解
2019/07/17 Python
python如何解析复杂sql,实现数据库和表的提取的实例剖析
2020/05/15 Python
Python多线程的退出控制实现
2020/08/10 Python
CSS3教程(8):CSS3透明度指南
2009/04/02 HTML / CSS
CSS3使用transition实现的鼠标悬停淡入淡出
2015/01/09 HTML / CSS
Under Armour安德玛英国官网:美国高端运动科技品牌
2018/09/17 全球购物
一份报关员的职业规划范文
2014/01/08 职场文书
幼儿园教师考核制度
2014/02/01 职场文书
写求职信要注意什么问题
2014/04/12 职场文书
宣传部部长竞选演讲稿
2014/04/26 职场文书
担保书范文
2015/01/20 职场文书
2015年体育部工作总结
2015/04/02 职场文书
幼儿园开学通知
2015/04/24 职场文书
2015年银行信贷员工作总结
2015/05/19 职场文书
围城读书笔记
2015/06/26 职场文书
Mysql的Table doesn't exist问题及解决
2022/12/24 MySQL