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 相关文章推荐
通过5个php实例细致说明传值与传引用的区别
Aug 08 PHP
PHP开发工具ZendStudio下Xdebug工具使用说明详解
Nov 11 PHP
PHP数据库操作之基于Mysqli的数据库操作类库
Apr 19 PHP
php中session过期时间设置及session回收机制介绍
May 05 PHP
CI框架中通过hook的方式实现简单的权限控制
Jan 07 PHP
php通过sort()函数给数组排序的方法
Mar 18 PHP
PHP数组操作类实例
Jul 11 PHP
PHP屏蔽关键字实现方法
Nov 17 PHP
PHP基于GD2函数库实现验证码功能示例
Jan 27 PHP
详解PHP PDO简单教程
May 28 PHP
XAMPP升级PHP版本实现步骤解析
Sep 04 PHP
关于PHP求解三数之和问题详析
Nov 09 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
《星际争霸II》全新指挥官斯台特曼现已上线
2020/03/08 星际争霸
mysql 搜索之简单应用
2007/04/27 PHP
PHP文件读写操作相关函数总结
2014/11/18 PHP
PHP使用file_get_content设置头信息的方法
2016/02/14 PHP
php实现等比例不失真缩放上传图片的方法
2016/11/14 PHP
php中Swoole的热更新实现代码实例
2021/03/04 PHP
JQuery 表单中textarea字数限制实现代码
2009/12/07 Javascript
javascript中substr,substring,slice.splice的区别说明
2010/11/25 Javascript
JS异常处理的一个想法(sofish)
2013/03/14 Javascript
js中Math之random,round,ceil,floor的用法总结
2013/12/26 Javascript
多选列表框动态添加,移动,删除,全选等操作的简单实例
2014/01/13 Javascript
基于jQuery仿淘宝产品图片放大镜特效
2020/10/19 Javascript
微信小程序五星评分效果实现代码
2017/04/06 Javascript
微信小程序 action-sheet 反馈上拉菜单简单实例
2017/05/11 Javascript
AngularJS实用基础知识_入门必备篇(推荐)
2017/07/10 Javascript
vue项目中axios使用详解
2018/02/07 Javascript
Vue前后端不同端口的实现方法
2018/09/19 Javascript
微信小程序云开发之新手环境配置
2019/05/16 Javascript
jQuery操作cookie的示例代码
2019/06/05 jQuery
js消除图片小游戏代码
2019/12/11 Javascript
python del()函数用法
2013/03/24 Python
解决Python出现_warn_unsafe_extraction问题的方法
2016/03/24 Python
基于asyncio 异步协程框架实现收集B站直播弹幕
2016/09/11 Python
python爬取内容存入Excel实例
2019/02/20 Python
Python+OpenCV+图片旋转并用原底色填充新四角的例子
2019/12/12 Python
python2.7使用scapy发送syn实例
2020/05/05 Python
Keras实现DenseNet结构操作
2020/07/06 Python
如何用python 操作zookeeper
2020/12/28 Python
介绍一下SQL Server里面的索引视图
2016/07/31 面试题
shallow copy和deep copy的区别
2016/05/09 面试题
家长评语和期望
2014/02/10 职场文书
社区国庆节活动总结
2015/03/23 职场文书
原生JS实现飞机大战小游戏
2021/06/09 Javascript
总结python多进程multiprocessing的相关知识
2021/06/29 Python
分享一个vue实现的记事本功能案例
2022/04/11 Vue.js
Java中的Kafka为什么性能这么快及4大核心详析
2022/09/23 Java/Android