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在字符串中查找另一个字符串
Nov 19 PHP
php 各种应用乱码问题的解决方法
May 09 PHP
PHP 遍历文件实现代码
May 04 PHP
深入解析php中的foreach问题
Jun 30 PHP
ThinkPHP模板IF标签用法详解
Jul 01 PHP
CodeIgniter中实现泛域名解析
Jul 19 PHP
PHP使用PDO连接ACCESS数据库
Mar 05 PHP
WordPress中登陆后关闭登陆页面及设置用户不可见栏目
Dec 31 PHP
浅谈ThinkPHP中initialize和construct的区别
Apr 01 PHP
PDO::errorCode讲解
Jan 28 PHP
PHP时间函数使用详解
Mar 21 PHP
php文件上传原理与实现方法详解
Dec 20 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
兼容PHP5的PHP目录管理函数库
2008/07/10 PHP
FireFox浏览器使用Javascript上传大文件
2013/10/30 PHP
ThinkPHP分组下自定义标签库实例
2014/11/01 PHP
php创建多级目录的方法
2015/03/24 PHP
php实现比较全的数据库操作类
2015/06/18 PHP
php获取网站百度快照日期的方法
2015/07/29 PHP
php7安装yar扩展的方法详解
2017/08/03 PHP
ecshop添加菜单及权限分配问题
2017/11/21 PHP
PHP使用两个栈实现队列功能的方法
2018/01/15 PHP
js获取单元格自定义属性值的代码(IE/Firefox)
2010/04/05 Javascript
js中匿名函数的N种写法
2010/09/08 Javascript
jQuery图片的展开和收缩实现代码
2013/04/16 Javascript
js随机颜色代码的多种实现方式
2013/04/23 Javascript
60个很实用的jQuery代码开发技巧收集
2014/12/15 Javascript
Angularjs制作简单的路由功能demo
2015/04/14 Javascript
使用Meteor配合Node.js编写实时聊天应用的范例
2015/06/23 Javascript
基于JavaScript实现拖动滑块效果
2017/02/16 Javascript
ES6使用Set数据结构实现数组的交集、并集、差集功能示例
2017/10/31 Javascript
Vue封装一个简单轻量的上传文件组件的示例
2018/03/21 Javascript
vue界面发送表情的实现代码
2020/09/11 Javascript
[51:26]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#3Secret VS OG第二局
2016/03/03 DOTA
[04:10]2018年度CS GO玩家最喜爱的主播-完美盛典
2018/12/16 DOTA
Python 的描述符 descriptor详解
2016/02/27 Python
对pandas中apply函数的用法详解
2018/04/10 Python
Python实现的统计文章单词次数功能示例
2019/07/08 Python
Python pickle模块常用方法代码实例
2020/10/10 Python
python中append函数用法讲解
2020/12/11 Python
canvas实现圆绘制的示例代码
2019/09/11 HTML / CSS
编辑硕士自荐信范文
2013/11/27 职场文书
元旦寄语大全
2014/04/10 职场文书
小学生关于梦想的演讲稿
2014/08/22 职场文书
计划生育汇报材料
2014/12/26 职场文书
2016年中学植树节活动总结
2016/03/16 职场文书
Html5调用企业微信的实现
2021/04/16 HTML / CSS
Python控制台输出俄罗斯方块移动和旋转功能
2021/04/18 Python
python3中apply函数和lambda函数的使用详解
2022/02/28 Python