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 相关文章推荐
zend framework多模块多布局配置
Feb 26 PHP
PHP中for与foreach的区别分析
Mar 09 PHP
PHP中SESSION使用中的一点经验总结
Mar 30 PHP
PHP如何利用P3P实现跨域
Aug 24 PHP
php跨站攻击实例分析
Oct 28 PHP
php采集神器cURL使用方法详解
Feb 19 PHP
Laravel 5.1 on SAE环境开发教程【附项目demo源码】
Oct 09 PHP
php根据数据id自动生成编号的实现方法
Oct 16 PHP
php数组实现根据某个键值将相同键值合并生成新二维数组的方法
Apr 26 PHP
php记录搜索引擎爬行记录的实现代码
Mar 02 PHP
PHP实现的操作数组类库定义与用法示例
May 24 PHP
使用Laravel中的查询构造器实现增删改查功能
Sep 03 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
php xml 入门学习资料
2011/01/01 PHP
php验证手机号码(支持归属地查询及编码为UTF8)
2013/02/01 PHP
PHP中Session引起的脚本阻塞问题解决办法
2014/04/08 PHP
php微信浏览器分享设置以及回调详解
2016/08/01 PHP
PHP会话操作之cookie用法分析
2016/09/28 PHP
PHP实时统计中文字数和区别
2019/02/28 PHP
修复ie8&amp;chrome下window的resize事件多次执行
2011/10/20 Javascript
javascript随机将第一个dom中的图片添加到第二个div中示例
2013/10/08 Javascript
js确认删除对话框适用于a标签及submit
2014/07/10 Javascript
javascript的push使用指南
2014/12/05 Javascript
jQuery中:hidden选择器用法实例
2014/12/30 Javascript
JS实现先显示大图后自动收起显示小图的广告代码
2015/09/04 Javascript
javascript基础知识分享之类与函数化
2016/02/13 Javascript
javascript实现粘贴qq截图功能(clipboardData)
2016/05/29 Javascript
Javascript基础_嵌入图像的简单实现
2016/06/14 Javascript
微信小程序组件 contact-button(客服会话按钮)详解及实例代码
2017/01/10 Javascript
vue动画之点击按钮往上渐渐显示出来的实例
2018/09/29 Javascript
vue插件draggable实现拖拽移动图片顺序
2018/12/01 Javascript
浅谈laytpl 模板空值显示null的解决方法及简单的js表达式
2019/09/19 Javascript
详解利用nodejs对本地json文件进行增删改查
2019/09/20 NodeJs
你不知道的 TypeScript 高级类型(小结)
2020/08/28 Javascript
Python中使用MELIAE分析程序内存占用实例
2015/02/18 Python
python数组复制拷贝的实现方法
2015/06/09 Python
Python+selenium实现截图图片并保存截取的图片
2018/01/05 Python
python监控进程脚本
2018/04/12 Python
基于python实现聊天室程序
2018/07/27 Python
在Pycharm中调试Django项目程序的操作方法
2019/07/17 Python
Pycharm自动添加文件头注释和函数注释参数的方法
2020/10/23 Python
python中watchdog文件监控与检测上传功能
2020/10/30 Python
Python爬虫后获取重定向url的两种方法
2021/01/19 Python
美国领先的眼镜和太阳镜在线零售商:Glasses.com
2019/08/26 全球购物
颇特女士香港官网:NET-A-PORTER香港
2021/03/08 全球购物
热爱祖国演讲稿
2014/05/04 职场文书
反邪教学习心得体会
2016/01/15 职场文书
SpringDataJPA实体类关系映射配置方式
2021/12/06 Java/Android
React更新渲染原理深入分析
2022/12/24 Javascript