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 相关文章推荐
别人整理的服务器变量:$_SERVER
Oct 20 PHP
使用 PHPMAILER 发送邮件实例应用
Nov 07 PHP
div li的多行多列 无刷新分页示例代码
Oct 16 PHP
PHP之APC缓存详细介绍 apc模块安装
Jan 13 PHP
destoon首页调用求购供应信息的地区名称的方法
Aug 21 PHP
PHP中使用file_get_contents抓取网页中文乱码问题解决方法
Dec 17 PHP
php将文本文件转换csv输出的方法
Dec 31 PHP
php生成不重复随机数、数组的4种方法分享
Mar 30 PHP
php实现转换ubb代码的方法
Jun 18 PHP
php实现微信公众号无限群发
Oct 11 PHP
完美解决phpexcel导出到xls文件出现乱码的问题
Oct 29 PHP
PHP实现在对象之外访问其私有属性private及保护属性protected的方法
Nov 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
火影忍者:这才是千手柱间和扉间的真正死因,角都就比较搞笑了!
2020/03/10 日漫
php5 图片验证码实现代码
2009/12/11 PHP
php url路由入门实例
2014/04/23 PHP
PHP使用strtotime计算两个给定日期之间天数的方法
2015/03/18 PHP
php获取指定(访客)IP所有信息(地址、邮政编码、国家、经纬度等)的方法
2015/07/06 PHP
laravel学习教程之存取器
2016/07/30 PHP
PHP面向对象程序设计重载(overloading)操作详解
2019/06/13 PHP
php使用yield对性能提升的测试实例分析
2019/09/19 PHP
ajax 文件上传应用简单实现
2009/03/03 Javascript
Javascript 变量作用域 两个可能会被忽略的小特性
2010/03/23 Javascript
jQueryUI如何自定义组件实现代码
2010/11/14 Javascript
javascript拓展DOM操作 prependChild insertAfert
2010/11/17 Javascript
Jquery 绑定时间实现代码
2011/05/03 Javascript
使用jQuery获得内容以及内容的属性
2015/02/26 Javascript
jQuery.form插件的使用及跨域异步上传文件
2016/04/27 Javascript
JS在一定时间内跳转页面及各种刷新页面的实现方法
2016/05/26 Javascript
AngularJS使用angular.bootstrap完成模块手动加载的方法分析
2017/01/19 Javascript
ajax+node+request爬取网络图片的实例(宅男福利)
2017/08/28 Javascript
vue生命周期实例小结
2018/08/15 Javascript
JavaScript实现的开关灯泡点击切换特效示例
2019/07/08 Javascript
简单介绍Python中的RSS处理
2015/04/13 Python
使用pyecharts在jupyter notebook上绘图
2020/04/23 Python
python绘制双柱形图代码实例
2017/12/14 Python
解决DataFrame排序sort的问题
2018/06/07 Python
Python 爬虫实现增加播客访问量的方法实现
2019/10/31 Python
Python如何基于Tesseract实现识别文字功能
2020/06/05 Python
html5实现输入框fixed定位在屏幕最底部兼容性
2020/07/03 HTML / CSS
乐天旅游台湾网站:Rakuten Travel TW
2017/06/01 全球购物
工程部经理岗位职责
2013/12/08 职场文书
2014年国庆晚会主持词
2014/09/19 职场文书
2014年学生会生活部工作总结
2014/11/07 职场文书
会计工作检讨书
2015/02/19 职场文书
离婚案件答辩状
2015/05/22 职场文书
家庭经济困难证明
2015/06/23 职场文书
SpringBoot整合RabbitMQ的5种模式实战
2021/08/02 Java/Android
CSS 实现Chrome标签栏的技巧
2021/08/04 HTML / CSS