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编程中八种常见的文件操作方式
Nov 19 PHP
php中关于普通表单多文件上传的处理方法
Mar 25 PHP
php获取mysql数据库中的所有表名的代码
Apr 23 PHP
第六章 php目录与文件操作
Dec 30 PHP
Linux Apache PHP Oracle 安装配置(具体操作步骤)
Jun 17 PHP
Codeigniter实现多文件上传并创建多个缩略图
Jun 12 PHP
php.ini save_handler 修改不生效的解决办法
Jul 22 PHP
简单解析PHP程序的运行流程
Jun 23 PHP
ThinkPHP5.0 图片上传生成缩略图实例代码说明
Jun 20 PHP
Django 标签筛选的实现代码(一对多、多对多)
Sep 05 PHP
golang实现php里的serialize()和unserialize()序列和反序列方法详解
Oct 30 PHP
PHP接入微信H5支付的方法示例
Oct 28 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脚本代码
2011/02/19 PHP
解析PHP汉字转换拼音的类
2013/06/18 PHP
PHP中实现生成静态文件的方法缓解服务器压力
2014/01/07 PHP
开源php中文分词系统SCWS安装和使用实例
2014/04/11 PHP
php中get_meta_tags()、CURL与user-agent用法分析
2014/12/16 PHP
Windows 下安装 swoole 图文教程(php)
2017/06/05 PHP
用javascript实现画板的代码
2007/09/05 Javascript
网站如何做到完全不需要jQuery也可以满足简单需求
2013/06/27 Javascript
js+css实现的简单易用兼容好的分页
2013/12/30 Javascript
jQuery插件EasyUI获取当前Tab中iframe窗体对象的方法
2016/08/05 Javascript
工厂模式在JS中的实践
2017/01/18 Javascript
Node.js中DNS模块学习总结
2018/02/28 Javascript
vue单个组件实现无限层级多选菜单功能
2018/04/10 Javascript
使用Vue组件实现一个简单弹窗效果
2018/04/23 Javascript
layui select 禁止点击的实现方法
2019/09/05 Javascript
微信小程序scroll-view点击项自动居中效果的实现
2020/03/25 Javascript
vue-router懒加载的3种方式汇总
2021/02/28 Vue.js
[03:37]2016完美“圣”典 风云人物:Mikasa专访
2016/12/07 DOTA
使用Python的Flask框架构建大型Web应用程序的结构示例
2016/06/04 Python
Python 40行代码实现人脸识别功能
2017/04/02 Python
13个最常用的Python深度学习库介绍
2017/10/28 Python
Python 3 使用Pillow生成漂亮的分形树图片
2019/12/24 Python
浅谈opencv自动光学检测、目标分割和检测(连通区域和findContours)
2020/06/04 Python
keras实现VGG16方式(预测一张图片)
2020/07/07 Python
Python3交互式shell ipython3安装及使用详解
2020/07/11 Python
Python 实现微信自动回复的方法
2020/09/11 Python
Python安装第三方库攻略(pip和Anaconda)
2020/10/15 Python
与世界上最好的跑步专业品牌合作:Fleet Feet
2019/03/22 全球购物
英文自荐信格式
2013/11/28 职场文书
暑期社会实践感言
2014/02/25 职场文书
2015元旦晚会主持词(开场白+结束语)
2014/12/14 职场文书
大学班干部竞选稿
2015/11/20 职场文书
《走遍天下书为侣》教学反思
2016/02/22 职场文书
golang gopm get -g -v 无法获取第三方库的解决方案
2021/05/05 Golang
MySQL中IO问题的深入分析与优化
2022/04/02 MySQL
Python字符串常规操作小结
2022/04/03 Python