PHP中数组的三种排序方法分享


Posted in PHP onMay 07, 2012

一、冒泡排序法
说明:找到最大的数,排列到最后面,然后继续找

例:

$arr = array(3,5,-1,0,2); 
for($i=0;$i<count($arr)-1;$i++){ 
for($j=0;$j<count($arr)-1-$i;$j++){ 
if($arr[$j]>$arr[$j+1]){ 
$temp = $arr[$j]; 
$arr[$j]=$arr[$j+1]; 
$arr[$j+1]=$temp; 
} 
} 
}

理解:
3,5,-1,0,2
//从第一个数开始往后比较,如果比后面的数大则与后面的数调位置
//第一次,3小于5,那么不变
//第二次,5大于-1,那么变成
3,-1,5,0,2
//第三次,5大于0
3,-1,0,5,2
//第四次,5大于2
3,-1,0,2,5
至此完成一次内循环,此时最后一个数完成排序,下次将不参与
3,-1,0,2,5第二次外循环开始 第一次:3大于-1
-1,3,0,2,5
第二次:3大于0
-1,0,3,2,5
第三次:3大于2
-1,0,2,3,5
至此完成后面两位数的排序了,接下来类推
-1,0,2,3,5
二、选择排序法
说明:先假设第一个数就是最小的数,然后将后面的数依次与它比较,如果假设的数不是最小的数,就将它与后面的最小的数调换位置
$arr=array(2,1,-1,3,0); 
for($i=0;$i<count($arr)-1;$i++){ 
$minval = $arr[$i]; 
$minindex = $i; 
for($j=1+$i;$j<count($arr);$j++){ 
if($arr[$j]<$minval){ 
$minval = $arr[$j]; 
$minindex = $j; 
} 
} 
$temp = $arr[$i]; 
$arr[$i] = $arr[$minindex]; 
$arr[$minindex] = $temp; 
}

理解:
2,1,-1,3,0
//先假设第一个数2为最小值,它后面的数依次与2做比较,寻找到最小的那个数
过程:
1小于2,那么minval=1
-1小于1,那么minval=-1
3大于-1,不变
0大于-1,不变
那么现在就找到了该数组中最小的数了为-1
将-1与2调换位置就完成第一个数的排序了
那么现在数组变成
-1,1,2,3,0
现在第一个数-1已经为有序,所以不参与比较了,往后面继续
现在假设minval=1
2大于1,不变
3大于1,不变
0小于1,那么minval=0
现在一次循环完成,调换0与1的位置完成第二个数的排序
那么现在数组变成
-1,0,2,3,1
//后面的推法与上面相同。。。

三、插入排序法

说明:先假设一个数组中的第一个数为单独的有序数组,再将后面的一个数与它【这里随它I的增长,就变成它们了】做比较,如果后面的数比假设的数还小,则将小的那个数后移,最后将那个数移到最前面

$arr=array(2,1,-1,3,0); 
for($i=1;$i<count($arr);$i++){ 
$insertval=$arr[$i]; 
$insertindex = $i-1; 
while($insertindex>=0 && $insertval<$arr[$insertindex]){ 
$arr[$insertindex+1]=$arr[$insertindex]; 
$insertindex--; 
} 
$temp = $arr[$i]; 
$arr[$insertindex+1]=$insertval; 
}

理解:
2,1,-1,3,0
//第一次,先保存待插入的数1为insertval,再拿 insertval 与2比较,1小于2,所以把2后移,变成如下的图
2,2,-1,3,0
//此时2前面没有数字了,insertindex=0,所以比较完成,那么将insertval插入到寻找到的这个位置。变成如下图
1,2,-1,3,0
//此时,1,2变成有序数组
//第二次,先保存待插入的数-1为insertval,再拿insertval与2做比较,-1小于2,所以把2后移,变成如下图
1,2,2,3,0
//此时,再拿insertval与1做比较,-1小于1,那么把-1后移,变成如下图(这就是一个拿待插入数与前面的有序数组比较的过程)
1,1,2,3,0
//此时,insertindex到头了,所以将insertval插入该位置
-1,1,2,3,0
//后面推法如上
PHP 相关文章推荐
php session_start()关于Cannot send session cache limiter - headers already sent错误解决方法
Nov 27 PHP
PHP中register_globals参数为OFF和ON的区别(register_globals 使用详解)
Feb 05 PHP
如何使用PHP实现javascript的escape和unescape函数
Jun 29 PHP
php内核解析:PHP中的哈希表
Jan 30 PHP
ThinkPHP之N方法实例详解
Jun 20 PHP
PHP删除指定目录中的所有目录及文件的方法
Feb 26 PHP
教你在PHPStorm中配置Xdebug
Jul 27 PHP
php计算给定日期所在周的开始日期和结束日期示例
Feb 06 PHP
PHP中的日期时间处理利器实例(Carbon)
Jun 09 PHP
php实现的二分查找算法示例
Jun 20 PHP
Laravel 5.5 的自定义验证对象/类示例代码详解
Aug 29 PHP
Laravel 前端资源配置教程
Oct 18 PHP
PHP面向对象三大特点学习(充分理解抽象、封装、继承、多态)
May 07 #PHP
php错误、异常处理机制(补充)
May 07 #PHP
PHP中的错误处理、异常处理机制分析
May 07 #PHP
PHP面向对象的进阶学习(抽像类、接口、final、类常量)
May 07 #PHP
PHP file_exists问题杂谈
May 07 #PHP
php提示Call-time pass-by-reference has been deprecated in的解决方法[已测]
May 06 #PHP
无法在发生错误时创建会话,请检查 PHP 或网站服务器日志,并正确配置 PHP 安装(win+linux)
May 05 #PHP
You might like
删除无限分类并同时删除它下面的所有子分类的方法
2010/08/08 PHP
PHP实现支付宝即时到账功能
2016/12/21 PHP
thinkPHP框架通过Redis实现增删改查操作的方法详解
2019/05/13 PHP
php依赖注入知识点详解
2019/09/23 PHP
一端时间轮换的广告
2006/06/26 Javascript
取选中的radio的值
2010/01/11 Javascript
JavaScript 拾碎[三] 使用className属性
2010/10/16 Javascript
jquery获得下拉框值的代码
2011/08/13 Javascript
JS+DIV实现鼠标划过切换层效果的实例代码
2013/11/26 Javascript
js控制分页打印、打印分页示例
2014/02/08 Javascript
原生js获取宽高与jquery获取宽高的方法关系对比
2014/04/04 Javascript
JavaScript实现三阶幻方算法谜题解答
2014/12/29 Javascript
javaScript中slice函数用法实例分析
2015/06/08 Javascript
JavaScript数组迭代器实例分析
2015/06/09 Javascript
JS+CSS实现经典的左侧竖向滑动菜单效果
2015/09/23 Javascript
js监听键盘事件的方法_原生和jquery的区别详解
2016/10/10 Javascript
AngularJS 与Bootstrap实现表格分页实例代码
2016/10/14 Javascript
es6新特性之 class 基本用法解析
2018/05/05 Javascript
vue+egg+jwt实现登录验证的示例代码
2019/05/18 Javascript
Layui数据表格 前后端json数据接收的方法
2019/09/19 Javascript
JQuery基于FormData异步提交数据文件
2020/09/01 jQuery
解决vant title-active-color与title-inactive-color不生效问题
2020/11/03 Javascript
在vue中嵌入外部网站的实现
2020/11/13 Javascript
python使用正则搜索字符串或文件中的浮点数代码实例
2014/07/11 Python
使用Python中的cookielib模拟登录网站
2015/04/09 Python
详解python的几种标准输出重定向方式
2016/08/15 Python
对pandas中to_dict的用法详解
2018/06/05 Python
如何用OpenCV -python3实现视频物体追踪
2019/12/04 Python
Tensorflow中批量读取数据的案列分析及TFRecord文件的打包与读取
2020/06/30 Python
Python 使用生成器代替线程的方法
2020/08/04 Python
HTML5 progress和meter控件_动力节点Java学院整理
2017/07/06 HTML / CSS
写一个函数,要求输入一个字符串和一个字符长度,对该字符串进行分隔
2015/07/30 面试题
银行出纳岗位职责
2013/11/25 职场文书
《动手做做看》教学反思
2014/04/09 职场文书
车间主任岗位职责范本
2015/04/08 职场文书
Java中的随机数Random
2022/03/17 Java/Android