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 相关文章推荐
如何过滤高亮显示非法字符
Oct 09 PHP
模仿OSO的论坛(一)
Oct 09 PHP
require(),include(),require_once()和include_once()区别
Mar 27 PHP
PHP面向对象学习笔记之二 生成对象的设计模式
Oct 06 PHP
基于HBase Thrift接口的一些使用问题及相关注意事项的详解
Jun 03 PHP
解析php file_exists无效的解决办法
Jun 26 PHP
php计算两个文件相对路径的方法
Mar 14 PHP
yii框架无限极分类的实现方法
Apr 08 PHP
php把字符串指定字符分割成数组的方法
Mar 12 PHP
ThinkPHP5&amp;5.1实现验证码的生成、使用及点击刷新功能示例
Feb 07 PHP
Yii框架小部件(Widgets)用法实例详解
May 15 PHP
Thinkphp极验滑动验证码实现步骤解析
Nov 24 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
javascript json 新手入门文档
2009/12/03 Javascript
关于JS判断图片是否加载完成且获取图片宽度的方法
2013/04/09 Javascript
JavaScript中使用Object.prototype.toString判断是否为数组
2015/04/01 Javascript
基于javascript实现样式清新图片轮播特效
2016/03/30 Javascript
JS只能输入正整数的简单实例
2016/10/07 Javascript
vue动态组件实现选项卡切换效果
2017/03/08 Javascript
JS switch判断 三目运算 while 及 属性操作代码
2017/09/03 Javascript
原生JS实现前端本地文件上传
2018/09/08 Javascript
ionic使用angularjs表单验证(模板验证)
2018/12/12 Javascript
jQuery实现根据身份证号获取生日、年龄、性别等信息的方法
2019/01/09 jQuery
vue-loader中引入模板预处理器的实现
2019/09/04 Javascript
借助云开发实现小程序短信验证码的发送
2020/01/06 Javascript
js实现点赞按钮功能的实例代码
2020/03/06 Javascript
vue 使用class创建和清除水印的示例代码
2020/12/25 Vue.js
[42:25]2018DOTA2亚洲邀请赛 4.5 淘汰赛 LGD vs Liquid 第三场
2018/04/06 DOTA
Python中的__new__与__init__魔术方法理解笔记
2014/11/08 Python
Python找出文件中使用率最高的汉字实例详解
2015/06/03 Python
python 生成器生成杨辉三角的方法(必看)
2017/04/10 Python
Python简单生成8位随机密码的方法
2017/05/24 Python
解决django服务器重启端口被占用的问题
2019/07/26 Python
Python 单例设计模式用法实例分析
2019/09/23 Python
wxpython绘制音频效果
2019/11/18 Python
wxPython电子表格功能wx.grid实例教程
2019/11/19 Python
Expedia丹麦:全球领先的旅游网站
2018/03/18 全球购物
广州一家公司的.NET面试题
2016/06/11 面试题
3个CCIE对一个工程师的面试题
2012/05/06 面试题
班组长工作职责
2013/12/25 职场文书
领导班子对照检查材料
2014/09/22 职场文书
教师四风自我剖析材料
2014/09/30 职场文书
2014年小学辅导员工作总结
2014/12/23 职场文书
JavaScript 去重和重复次数统计
2021/03/31 Javascript
解决Pytorch半精度浮点型网络训练的问题
2021/05/24 Python
用Python编写简单的gRPC服务的详细过程
2021/07/04 Python
为Centos安装指定版本的Docker
2022/04/01 Servers
vue使用element-ui按需引入
2022/05/20 Vue.js
JS前端canvas交互实现拖拽旋转及缩放示例
2022/08/05 Javascript