PHP排序算法的复习和总结


Posted in PHP onFebruary 15, 2012

直接上代码吧!

<?php 
/* 
* 插入排序(一维数组) 
* 每次将一个待排序的数据元素,插入到前面已经排好序的数列中的适当的位置,使数列依然有序;直到待排序的数据元素全部插入完成为止。 
*/ 
function insertSort($arr){ 
if(!is_array($arr) || count($arr)==0){ 
return $arr; 
} 
$count = count($arr); 
for($i=1; $i<$count; $i++){ 
if(isset($arr[$i])){ 
 $tmp = $arr[$i]; //获取后一个元素的值 

 $j = $i - 1; //获取前面的下标 

 while($arr[$j] > $tmp){ //如果前面一个比后面一个大, 这里是从小到大 

  $arr[$j+1] = $arr[$j]; //把小的元素和前面的对换,直到移动到合适的位置,在移动下一个 

  $arr[$j] = $tmp; 

  $j--; 

 } 
} 
} 
return $arr; 
} 

 
/* 
* 选择排序(一维数组) 
* 每一趟从待排序的数据元素中选出最小(最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。 
*/ 
function selectSort($arr){ 
if(!is_array($arr) || count($arr) == 0) 
{ 
return $arr; 
} 
$count = count($arr); 
for($i=0; $i<$count; $i++){ 
$k = $i; 
for($j=$i+1; $j<$count; $j++){ 

if ($arr[$k] > $arr[$j]) 


$k = $j; //找出最小的 

 if ($k != $i){ 


 $tmp = $arr[$i]; 


 $arr[$i] = $arr[$k]; 


 $arr[$k] = $tmp; 

 } 
} 
} 
return $arr; 
} 
/*
 
* 冒泡排序(一维数组) 
* 两两比较待排序数据元素的大小,发现两个数据元素的次序相反即进行交换,直到没有反序的数据元素为止 
*/ 
function bubbleSort($array){ 
$count = count($array); 
if ($count <= 0) { 
return false; 
} 
for($i=0; $i<$count; $i++){ 
for($j=$count-1; $j>$i; $j--){ 

 if ($array[$j] < $array[$j-1]){ //比较找到的数进行交换 


$tmp = $array[$j]; 


$array[$j] = $array[$j-1]; 


$array[$j-1] = $tmp; 

 } 
} 
} 
return $array; 
} 

 
/* 
* 快速排序(一维数组) 
* 
*/ 
function quickSort($array){ 
if (count($array) <= 1){ 
return $array; 
} 
$key = $array[0]; 
$left_arr = array(); 
$right_arr = array(); 
for ($i=1; $i<count($array); $i++){ 

if ($array[$i] <= $key){ 

 $left_arr[] = $array[$i]; 

}else{ 
 $right_arr[] = $array[$i]; 
} 
} 
$left_arr = quickSort($left_arr); 
$right_arr = quickSort($right_arr); 
return array_merge($left_arr, array($key), $right_arr); 
} 
/** 
* 按照元素的值进行排序 
* strOrder 为排列的顺序 asc 升序 desc 降序 
*/ 
function sortByVal($arr,$strOrder='asc') 
{ 
if(!is_array($arr) || count($arr)==0) 
{ 
return $arr; 
} 
$arrReturn = array(); 
foreach($arr as $key=>$val) 
{ 
$arrKey[] = $key; 
$arrVal[] = $val; 
} 
$count = count($arrVal); 
if($count) 
{ 
//创建key的顺序数组 
for($key=0;$key<$count;$key++) 
{ 
$arrKeyMap[$key] = $key; 
} 
//对值进行排序 
for($i=0;$i<$count;$i++) 
{ 
for($j = $count-1; $j>$i;$j--) 
{ 
//<从小到大排列 升降在这修改 
$bol = $strOrder == 'asc' ? $arrVal[$j]<$arrVal[$j-1] : $arrVal[$j]>$arrVal[$j-1]; 
if($bol){ 
$tmp = $arrVal[$j]; 
$arrVal[$j] = $arrVal[$j-1]; 
$arrVal[$j-1] = $tmp; 
//值的冒泡排序,引起key的数组的交互 
$keytmp = $arrKeyMap[$j]; 
$arrKeyMap[$j] = $arrKeyMap[$j-1]; 
$arrKeyMap[$j-1] = $keytmp; 
} 
} 
} 
if(count($arrKeyMap)) 
{ 
foreach ($arrKeyMap as $val) 
{ 
$arrReturn[] = $arrKey[$val]; 
} 
} 
return $arrReturn; 
} 
} 
/** 
* 使用原生的函数进行数组按照值进行排列 
*/ 
function arraySortByVal($arr,$keys,$type='asc'){ 
$keysvalue = $new_array = array(); 
foreach ($arr as $k=>$v){ 
$keysvalue[$k] = $v[$keys]; 
} 
if($type == 'asc'){ 
asort($keysvalue); 
}else{ 
arsort($keysvalue); 
} 
reset($keysvalue); 
foreach ($keysvalue as $k=>$v){ 
$new_array[$k] = $arr[$k]; 
} 
return $new_array; 
}

对于下面的2个对于array的值进行排序的方法一个是自己实现的一个是使用了原生的PHP函数的,其实排序对于少量数据一般就单页的数据量的数据还是可以的,如果涉及到大量的数据的排序,建议可以整合到MYSQL的基础类中来进行。
PHP 相关文章推荐
PHP中的日期及时间
Nov 23 PHP
PHP将DateTime对象转化为友好时间显示的实现代码
Sep 20 PHP
PHP 获取文件路径(灵活应用__FILE__)
Feb 15 PHP
深入PHP empty(),isset(),is_null()的实例测试详解
Jun 06 PHP
php实现微信公众平台账号自定义菜单类
Oct 11 PHP
PHP文件操作之获取目录下文件与计算相对路径的方法
Jan 08 PHP
PHP实现JS中escape与unescape的方法
Jul 11 PHP
php连接mysql数据库
Mar 21 PHP
Yii框架参数化查询中IN查询只能查询一个的解决方法
May 20 PHP
PHP实现多图上传和单图上传功能
May 17 PHP
PHP获取星期几的常用方法小结
Dec 18 PHP
PHP+RabbitMQ实现消息队列的完整代码
Mar 20 PHP
php网上商城购物车设计代码分享
Feb 15 #PHP
php后台多用户权限组思路与实现程序代码分享
Feb 13 #PHP
php _autoload自动加载类与机制分析
Feb 10 #PHP
php 文本文件的读取效率
Feb 10 #PHP
php+iframe实现隐藏无刷新上传文件
Feb 10 #PHP
PHP中集成PayPal标准支付的实现方法分享
Feb 06 #PHP
PHP中call_user_func_array()函数的用法演示
Feb 05 #PHP
You might like
php实现阳历阴历互转的方法
2015/10/28 PHP
PHP date()格式MySQL中插入datetime方法
2019/01/29 PHP
PHP微信发送推送消息乱码的解决方法
2019/02/28 PHP
EasyUI中的tree用法介绍
2011/11/01 Javascript
js 实现浏览历史记录示例
2014/04/20 Javascript
Node.js中child_process实现多进程
2015/02/03 Javascript
Angular.js如何从PHP读取后台数据
2016/03/24 Javascript
js 基础篇必看(点击事件轮播图的简单实现)
2016/08/20 Javascript
Windows系统下安装Node.js的步骤图文详解
2016/11/15 Javascript
JS正则获取HTML元素的方法
2017/03/31 Javascript
JavaScript实现反转字符串的方法详解
2017/04/27 Javascript
用React实现一个完整的TodoList的示例代码
2017/10/30 Javascript
vue2.5.2使用http请求获取静态json数据的实例代码
2018/02/27 Javascript
浅析vue.js数组的变异方法
2018/06/30 Javascript
vue实现移动端悬浮窗效果
2018/12/01 Javascript
vue接入腾讯防水墙代码
2019/05/07 Javascript
Vue实例的对象参数options的几个常用选项详解
2019/11/08 Javascript
Python中的random()方法的使用介绍
2015/05/15 Python
简单介绍Python的Django框架的dj-scaffold项目
2015/05/30 Python
python遍历文件夹下所有excel文件
2018/01/03 Python
Python序列循环移位的3种方法推荐
2018/04/09 Python
python去除扩展名的实例讲解
2018/04/23 Python
Linux下python3.6.1环境配置教程
2018/09/26 Python
对python条件表达式的四种实现方法小结
2019/01/30 Python
如何导出python安装的所有模块名称和版本号到文件中
2020/06/05 Python
通过实例了解python__slots__使用方法
2020/09/14 Python
诗普兰迪官方网站:Splendid
2018/09/18 全球购物
Book Depository美国:全球领先的专业网上书店之一
2019/08/14 全球购物
娇韵诗俄罗斯官方网站:Clarins俄罗斯
2020/10/03 全球购物
静态成员和非静态成员的区别
2012/05/12 面试题
介绍下static、final、abstract区别
2015/01/30 面试题
团日活动总结怎么写
2014/06/25 职场文书
“六查”、“三学”、“三干”查摆问题整改措施
2014/09/27 职场文书
商超业务员岗位职责
2015/02/13 职场文书
刑事撤诉申请书
2015/05/18 职场文书
文艺节目主持词
2015/07/06 职场文书