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 download.php实现代码 跳转到下载文件(response.redirect)
Aug 26 PHP
PHP隐形一句话后门,和ThinkPHP框架加密码程序(base64_decode)
Nov 02 PHP
解析smarty 截取字符串函数 truncate的用法介绍
Jun 20 PHP
分享一段php获取linux服务器状态的代码
May 27 PHP
thinkphp模板继承实例简述
Nov 26 PHP
php实现二进制和文本相互转换的方法
Apr 18 PHP
php中smarty变量修饰用法实例分析
Jun 11 PHP
php删除数组中重复元素的方法
Dec 22 PHP
PHP加密3DES报错 Call to undefined function: mcrypt_module_open() 如何解决
Apr 17 PHP
Yii2下session跨域名共存的解决方案
Feb 04 PHP
基于Codeigniter框架实现的student信息系统站点动态发布功能详解
Mar 23 PHP
Laravel 5.5基于内置的Auth模块实现前后台登陆详解
Dec 21 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
thinkPHP框架可添加js事件的分页类customPage.class.php完整实例
2017/03/16 PHP
thinkphp5 URL和路由的功能详解与实例
2017/12/26 PHP
对xmlHttp对象的理解
2011/01/17 Javascript
jquery的ajax简单结构示例代码
2014/02/17 Javascript
seajs中模块的解析规则详解和模块使用总结
2014/03/12 Javascript
Node.js 制作实时多人游戏框架
2015/01/08 Javascript
jQuery实现表单步骤流程导航代码分享
2015/08/28 Javascript
JavaScript简单获取系统当前时间完整示例
2016/08/02 Javascript
JQ选择器_选择同类元素的第N个子元素的实现方法
2016/09/08 Javascript
[原创]javascript typeof id==='string'?document.getElementById(id):id解释
2016/11/02 Javascript
Vue2.0如何发布项目实战
2017/07/27 Javascript
vue-resource拦截器设置头信息的实例
2017/10/27 Javascript
微信小程序三级联动选择器使用方法
2020/05/19 Javascript
使用vue-router为每个路由配置各自的title
2018/07/30 Javascript
vue实现数字动态翻牌的效果(开箱即用)
2019/12/08 Javascript
Python中使用scapy模拟数据包实现arp攻击、dns放大攻击例子
2014/10/23 Python
使用Python求解最大公约数的实现方法
2015/08/20 Python
Python的组合模式与责任链模式编程示例
2016/02/02 Python
JPype实现在python中调用JAVA的实例
2017/07/19 Python
python连接数据库的方法
2017/10/19 Python
python实现BackPropagation算法
2017/12/14 Python
python中的tcp示例详解
2018/12/09 Python
Python Scrapy图片爬取原理及代码实例
2020/06/12 Python
Foreo国际站:Foreo International
2018/10/29 全球购物
德国亚马逊官方网站:Amazon.de
2020/11/15 全球购物
JPA面试常见问题
2016/11/14 面试题
大学应届毕业生个人求职信
2013/09/23 职场文书
幼儿园小班评语
2014/04/18 职场文书
产品开发计划书
2014/04/27 职场文书
党员对照检查材料整改措施思想汇报
2014/09/26 职场文书
我的兄弟姐妹观后感
2015/06/15 职场文书
《合作意向书》怎么写?
2019/08/20 职场文书
2019事业单位个人工作总结范文
2019/08/26 职场文书
windows11怎么查看自己安装的版本号? win11版本号的查看方法
2021/11/21 数码科技
PostgreSQL13基于流复制搭建后备服务器的方法
2022/01/18 PostgreSQL
win10电脑关机快捷键是哪个 win10快速关机的几种方法
2022/08/14 数码科技