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 结果集的分页实现代码
Mar 10 PHP
php Http_Template_IT类库进行模板替换
Mar 19 PHP
php中使用preg_match_all匹配文章中的图片
Feb 06 PHP
php页面函数设置超时限制的方法
Dec 01 PHP
PHP里8个鲜为人知的安全函数分析
Dec 09 PHP
朋友网关于QQ相关的PHP代码(研究QQ的绝佳资料)
Jan 26 PHP
php递归删除目录与文件的方法
Jan 30 PHP
PHP从FLV文件获取视频预览图的方法
Mar 12 PHP
codeigniter中view通过循环显示数组数据的方法
Mar 20 PHP
php实现屏蔽掉黑帽SEO的搜索关键字
Apr 15 PHP
Joomla开启SEF的方法
May 04 PHP
Yii框架安装简明教程
May 15 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加水印的代码(支持半透明透明打水印,支持png透明背景)
2013/01/17 PHP
PHP分页详细讲解(有实例)
2013/10/30 PHP
ThinkPHP独立分组使用的注意事项
2014/11/25 PHP
[原创]php使用strpos判断字符串中数字类型子字符串出错的解决方法
2017/04/01 PHP
PHP实现RSA签名生成订单功能【支付宝示例】
2017/06/06 PHP
PHP通过文件路径获取文件名的实例代码
2018/10/14 PHP
PHP获取类私有属性的3种方法
2020/09/10 PHP
YUI模块开发原理详解
2013/11/18 Javascript
JS对象转换为Jquery对象示例
2014/01/26 Javascript
js获取input长度并根据页面宽度设置其大小及居中对齐
2014/08/22 Javascript
js添加事件的通用方法推荐
2016/05/15 Javascript
详解js中==与===的区别
2017/01/08 Javascript
记一次webpack3升级webpack4的踩坑经历
2018/06/12 Javascript
JavaScript使用递归和循环实现阶乘的实例代码
2018/08/28 Javascript
如何用JavaScript实现功能齐全的单链表详解
2019/02/11 Javascript
js实现简单进度条效果
2020/03/25 Javascript
vue实现从外部修改组件内部的变量的值
2020/07/30 Javascript
jQuery实现朋友圈查看图片
2020/09/11 jQuery
[02:05]2014DOTA2西雅图国际邀请赛 BBC第二天小组赛总结
2014/07/11 DOTA
python3实现短网址和数字相互转换的方法
2015/04/28 Python
浅谈插入排序算法在Python程序中的实现及简单改进
2016/05/04 Python
Django中利用filter与simple_tag为前端自定义函数的实现方法
2017/06/15 Python
Python切片操作深入详解
2018/07/27 Python
在Mac上删除自己安装的Python方法
2018/10/29 Python
Python+OpenCV+pyQt5录制双目摄像头视频的实例
2019/06/28 Python
django+tornado实现实时查看远程日志的方法
2019/08/12 Python
美国精品家居用品网站:US-Mattress
2016/08/24 全球购物
HUGO BOSS美国官方网上商店:世界知名奢侈品牌
2017/08/04 全球购物
餐厅销售主管职责范本
2014/02/19 职场文书
人事专员职责
2014/02/22 职场文书
公职人员索取回扣检举信
2014/04/04 职场文书
同学聚会通知书
2015/04/20 职场文书
《百分数的认识》教学反思
2016/02/19 职场文书
诗词赏析-(浣溪沙)
2019/08/13 职场文书
导游词之丽江普济寺
2019/10/22 职场文书
AJAX学习笔记
2021/05/18 Javascript