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中文本操作的类
Mar 17 PHP
10条PHP高级技巧[修正版]
Aug 02 PHP
php explode函数实例代码
Feb 27 PHP
php foreach循环中使用引用的问题
Nov 06 PHP
二进制交叉权限微型php类分享
Feb 07 PHP
PHP静态文件生成类实例
Nov 29 PHP
PHP编写学校网站上新生注册登陆程序的实例分享
Mar 21 PHP
Yii框架日志记录Logging操作示例
Jul 12 PHP
PHP获取访问设备信息的方法示例
Feb 20 PHP
laravel批量生成假数据的方法
Oct 09 PHP
thinkPHP框架乐观锁和悲观锁实例分析
Oct 30 PHP
PHP中通过getopt解析GNU C风格命令行选项
Nov 18 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
实现“上一页”和“下一页按钮
2006/10/09 PHP
php 静态化实现代码
2009/03/20 PHP
PHP 源代码压缩小工具
2009/12/22 PHP
Swoole-1.7.22 版本已发布,修复PHP7相关问题
2015/12/31 PHP
php英文单词统计器
2016/06/23 PHP
javascript中的location用法简单介绍
2007/03/07 Javascript
js的闭包的一个示例说明
2008/11/18 Javascript
jquery $.ajax各个事件执行顺序
2010/10/15 Javascript
jquery向.ashx文件post中文乱码问题的解决方法
2011/03/28 Javascript
Jquery中对数组的操作代码
2011/08/12 Javascript
extjs4 treepanel动态改变行高度示例
2013/12/17 Javascript
javascript 拷贝节点cloneNode()使用介绍
2014/04/03 Javascript
Node.js中的缓冲与流模块详细介绍
2015/02/11 Javascript
Bootstrap媒体对象的实现
2016/05/01 Javascript
原生JS实现九宫格抽奖效果
2017/04/01 Javascript
一篇文章让你彻底弄懂JS的事件冒泡和事件捕获
2017/08/14 Javascript
Node.js 中使用 async 函数的方法
2017/11/20 Javascript
动态Axios的配置步骤详解
2018/01/12 Javascript
JS实现二维数组横纵列转置的方法
2018/04/17 Javascript
vue 国际化 vue-i18n 双语言 语言包
2018/06/07 Javascript
微信小程序实现弹出菜单
2018/07/19 Javascript
JS实现数组的增删改查操作示例
2018/08/29 Javascript
vue-cli 3.x 修改dist路径的方法
2018/09/19 Javascript
详解vue之自行实现派发与广播(dispatch与broadcast)
2021/01/19 Vue.js
详解Python中break语句的用法
2015/05/14 Python
python 把文件中的每一行以数组的元素放入数组中的方法
2018/04/29 Python
python计算列表内各元素的个数实例
2018/06/29 Python
印度和世界各地的精美产品:Ikka Dukka
2018/02/12 全球购物
澳大利亚窗帘商店:Curtain Wonderland
2019/12/01 全球购物
简历上的自我评价
2014/02/03 职场文书
百年校庆节目主持词
2014/03/27 职场文书
仓库规划计划书
2014/04/28 职场文书
技术负责人任命书
2014/06/05 职场文书
2014年辅导员工作总结
2014/11/18 职场文书
太空授课观后感
2015/06/17 职场文书
java实现面板之间切换功能
2022/06/10 Java/Android