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 相关文章推荐
Session的工作方式
Oct 09 PHP
discuz 首页四格:最新话题+最新回复+热门话题+精华文章插件
Aug 19 PHP
php表单提交问题的解决方法
Apr 12 PHP
php 随机排序广告的实现代码
May 09 PHP
PHP查询网站的PR值
Oct 30 PHP
PHP采集类snoopy详细介绍(snoopy使用教程)
Jun 19 PHP
php选择排序法实现数组排序实例分析
Feb 16 PHP
解决php表单重复提交实现方法
Sep 29 PHP
PHP常见漏洞攻击分析
Feb 21 PHP
PHP实现根据数组的值进行分组的方法
Apr 20 PHP
PHP简单实现二维数组赋值与遍历功能示例
Oct 19 PHP
PHP获取HTTP body内容的方法
Dec 31 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
冰滴咖啡制作步骤
2021/03/03 冲泡冲煮
Yii2实现跨mysql数据库关联查询排序功能代码
2017/02/10 PHP
phpstorm激活码2020附使用详细教程
2020/09/25 PHP
JavaScript获取GridView选择的行内容
2009/04/14 Javascript
JavaScript prototype对象的属性说明
2010/03/13 Javascript
jQuery操作select的实例代码
2012/06/14 Javascript
基于jQuery的动态增删改查表格信息,可左键/右键提示(原创自Zjmainstay)
2012/07/31 Javascript
深入理解JavaScript系列(17):面向对象编程之概论详细介绍
2015/03/04 Javascript
详解JavaScript基本类型和引用类型
2015/12/09 Javascript
JS实现简单的tab切换选项卡效果
2016/09/21 Javascript
JS实现滑动门效果的方法详解
2016/12/19 Javascript
js实现滑动到页面底部自动加载更多功能
2017/02/15 Javascript
详解webpack打包vue时提取css
2017/05/26 Javascript
详解AngularJS脏检查机制及$timeout的妙用
2017/06/19 Javascript
深入理解Python中命名空间的查找规则LEGB
2015/08/06 Python
Python实现修改IE注册表功能示例
2018/05/10 Python
python筛选出两个文件中重复行的方法
2018/05/31 Python
Python 导入文件过程图解
2019/10/15 Python
Pyqt5自适应布局实例
2019/12/13 Python
如何解决安装python3.6.1失败
2020/07/01 Python
Python 3.10 的首个 PEP 诞生,内置类型 zip() 迎来新特性(推荐)
2020/07/03 Python
python logging 重复写日志问题解决办法详解
2020/08/04 Python
Scrapy中如何向Spider传入参数的方法实现
2020/09/28 Python
Python 中 sorted 如何自定义比较逻辑
2021/02/02 Python
美国值得信赖的婚恋交友网站:eHarmony
2018/10/04 全球购物
世界上最大的在线汽车租赁预订平台:Rentalcars.com(支持中文)
2018/10/12 全球购物
路政管理专业推荐信
2013/11/11 职场文书
财务会计专业个人求职信范本
2014/01/08 职场文书
银行办理业务介绍信
2014/01/18 职场文书
名企HR怎样看待求职信
2014/02/23 职场文书
关于运动会的口号
2014/06/07 职场文书
2015年妇委会工作总结
2015/05/22 职场文书
幼儿园开学温馨提示
2015/07/15 职场文书
Golang 入门 之url 包
2022/05/04 Golang
使用ICOM IC-R9500接收机同时测评十台收音机中波接收性能
2022/05/10 无线电
ConditionalOnProperty配置swagger不生效问题及解决
2022/06/14 Java/Android