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源代码
Oct 09 PHP
用PHP将网址字符串转换成超链接(网址或email)
May 25 PHP
PHP中__get()和__set()的用法实例详解
Jun 04 PHP
php判断正常访问和外部访问的示例
Feb 10 PHP
PHP输出一个等腰三角形的方法
May 12 PHP
php发送邮件的问题详解
Jun 22 PHP
深入探究PHP的多进程编程方法
Aug 18 PHP
php5.4传引用时报错问题分析
Jan 22 PHP
php使用高斯算法实现图片的模糊处理功能示例
Nov 11 PHP
PHP开发实现微信退款功能示例
Nov 25 PHP
PHP消息队列实现及应用详解【队列处理订单系统和配送系统】
May 20 PHP
Thinkphp 框架配置操作之配置加载与读取配置实例分析
May 15 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
PHPMailer邮件类利用smtp.163.com发送邮件方法
2008/09/11 PHP
php session_start()关于Cannot send session cache limiter - headers already sent错误解决方法
2009/11/27 PHP
Laravel中使用FormRequest进行表单验证方法及问题汇总
2016/06/19 PHP
PHP实现Huffman编码/解码的示例代码
2018/04/20 PHP
php利用array_search与array_column实现二维数组查找
2019/07/08 PHP
利用js制作html table分页示例(js实现分页)
2014/04/25 Javascript
JS实现一个按钮的方法
2015/02/05 Javascript
Highcharts使用简例及异步动态读取数据
2015/12/30 Javascript
JS+CSS实现DIV层的展开、收缩效果
2016/01/28 Javascript
jQuery获取某天的农历日期并判断是否除夕或新年的方法
2016/03/01 Javascript
深入理解JS中的substr和substring
2016/04/26 Javascript
jQuery基本选择器(实例及表单域value的获取方法)
2016/05/20 Javascript
Bootstrap下拉菜单更改为悬停(hover)触发的方法
2017/05/24 Javascript
关于vue.js v-bind 的一些理解和思考
2017/06/06 Javascript
JS+HTML+CSS实现轮播效果
2017/11/28 Javascript
node前端开发模板引擎Jade的入门
2018/05/11 Javascript
layui radio性别单选框赋值方法
2018/08/15 Javascript
vue组件表单数据回显验证及提交的实例代码
2018/08/30 Javascript
微信小程序整合使用富文本编辑器的方法详解
2019/04/25 Javascript
VUE.CLI4.0配置多页面入口的实现
2019/11/25 Javascript
python从ftp下载数据保存实例
2013/11/20 Python
Python实现数据库编程方法详解
2015/06/09 Python
requests和lxml实现爬虫的方法
2017/06/11 Python
Python实现邮件的批量发送的示例代码
2018/01/23 Python
python dict 相同key 合并value的实例
2019/01/21 Python
python的等深分箱实例
2019/11/22 Python
GNC健安喜美国官网:美国第一营养品牌
2016/07/22 全球购物
宝拉珍选美国官网:Paula’s Choice美国
2018/01/07 全球购物
一年级家长会邀请函
2014/01/25 职场文书
体育运动会广播稿
2014/10/05 职场文书
2016年会开场白台词
2015/06/01 职场文书
铁人观后感
2015/06/16 职场文书
七年级之家长会发言稿范文
2019/09/04 职场文书
PHP实现创建以太坊钱包转账等功能
2021/04/21 PHP
springboot入门 之profile设置方式
2022/04/04 Java/Android
Springboot中如何自动转JSON输出
2022/06/16 Java/Android