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 相关文章推荐
shopex主机报错误请求解决方案(No such file or directory)
Dec 27 PHP
php防止SQL注入详解及防范
Nov 12 PHP
php实现TCP端口检测的方法
Apr 01 PHP
浅谈PHP接收POST数据方式
Jun 05 PHP
PHP请求Socket接口测试实例
Aug 12 PHP
PHP获取IP地址所在地信息的实例(使用纯真IP数据库qqwry.dat)
Nov 15 PHP
CI框架中类的自动加载问题分析
Nov 21 PHP
PHP使用Redis实现防止大并发下二次写入的方法
Oct 09 PHP
PHP多线程模拟实现秒杀抢单
Feb 07 PHP
PHP调用全国天气预报数据接口查询天气示例
Feb 20 PHP
详解php中curl返回false的解决办法
Mar 18 PHP
解决laravel5.4下的group by报错的问题
Oct 16 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中实例Model方法的区别说明
2010/08/21 PHP
需要注意的几个PHP漏洞小结
2012/02/05 PHP
Linux编译升级php的详细方法
2013/11/04 PHP
php中adodbzip类实例
2014/12/08 PHP
Laravel 简单实现Ajax滚动加载示例
2019/10/22 PHP
JS 拼图游戏 面向对象,注释完整。
2009/06/18 Javascript
Prototype Selector对象学习
2009/07/23 Javascript
JavaScript 动态添加表格行 使用模板、标记
2009/10/24 Javascript
jQuery+CSS 实现随滚动条增减的汽水瓶中的液体效果
2011/09/26 Javascript
js动态设置鼠标事件示例代码
2013/10/30 Javascript
JS版的date函数(和PHP的date函数一样)
2014/05/12 Javascript
使用jquery选择器如何获取父级元素、同级元素、子元素
2014/05/14 Javascript
javascript实现日期按月份加减
2015/05/15 Javascript
基于JavaScript怎么实现让歌词滚动播放
2015/11/03 Javascript
JQuery ztree 异步加载实例讲解
2016/02/25 Javascript
JavaScript中Array对象用法实例总结
2016/11/29 Javascript
详解vue使用vue-layer-mobile组件实现toast,loading效果
2018/08/31 Javascript
js 动态校验开始结束时间的实现代码
2020/05/25 Javascript
[59:08]Ti4 冒泡赛第二天 NEWBEE vs Titan 2
2014/07/15 DOTA
分析Python中解析构建数据知识
2018/01/20 Python
Python2.7环境Flask框架安装简明教程【已测试】
2018/07/13 Python
python机器人运动范围问题的解答
2019/04/29 Python
Django结合ajax进行页面实时更新的例子
2019/08/12 Python
python利用JMeter测试Tornado的多线程
2020/01/12 Python
详解Python 实现 ZeroMQ 的三种基本工作模式
2020/03/24 Python
python 判断一组数据是否符合正态分布
2020/09/23 Python
python中time.ctime()实例用法
2021/02/03 Python
使用html5制作loading图的示例
2014/04/14 HTML / CSS
Linux面试经常问的文件系统操作命令
2016/10/04 面试题
机械个人求职信范文
2014/01/24 职场文书
上学路上观后感
2015/06/16 职场文书
安全第一课观后感
2015/06/18 职场文书
MySQL索引知识的一些小妙招总结
2021/05/10 MySQL
python执行js代码的方法
2021/05/13 Python
Python机器学习应用之工业蒸汽数据分析篇详解
2022/01/18 Python
MongoDB数据库之添删改查
2022/04/26 MongoDB