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 相关文章推荐
将数组写入txt文件 var_export
Apr 21 PHP
按上下级层次关系输出内容的PHP代码
Jul 17 PHP
Zend Framework页面缓存实例
Jun 25 PHP
PHPMailer发送HTML内容、带附件的邮件实例
Jul 01 PHP
php实现的九九乘法口诀表简洁版
Jul 28 PHP
用 Composer构建自己的 PHP 框架之构建路由
Oct 30 PHP
php输出xml属性的方法
Mar 19 PHP
PHP中使用GD库绘制折线图 折线统计图的绘制方法
Nov 09 PHP
PHP正则获取页面所有图片地址
Mar 23 PHP
php将print_r处理后的数据还原为原始数组的解决方法
Nov 02 PHP
PHP框架laravel的.env文件配置教程
Jun 07 PHP
详解PHP 二维数组排序保持键名不变
Mar 06 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+ajax实现无刷新动态加载数据技术
2015/04/28 PHP
浅谈PHP中Stream(流)
2015/06/08 PHP
PHP编写文件多服务器同步程序
2016/07/02 PHP
php实用代码片段整理
2016/11/12 PHP
thinkphp3.2实现跨控制器调用其他模块的方法
2017/03/14 PHP
Laravel5中Cookie的使用详解
2017/05/03 PHP
javascript是怎么继承的介绍
2012/01/05 Javascript
js切换div css注意的细节
2012/12/10 Javascript
js构造函数、索引数组和属性的实现方式和使用
2014/11/16 Javascript
AngularJS基础学习笔记之控制器
2015/05/10 Javascript
jQuery中绑定事件bind() on() live() one()的异同
2017/02/23 Javascript
JS实现的找零张数最小问题示例
2017/11/28 Javascript
解决微信浏览器缓存站点入口文件(IIS部署Vue项目)
2019/06/17 Javascript
axios异步提交表单数据的几种方法
2019/08/11 Javascript
countUp.js实现数字滚动效果
2019/10/18 Javascript
利用Python获取赶集网招聘信息前篇
2016/04/18 Python
深入理解python函数递归和生成器
2016/06/06 Python
深入了解Python数据类型之列表
2016/06/24 Python
Python中属性和描述符的正确使用
2016/08/23 Python
Python实现利用最大公约数求三个正整数的最小公倍数示例
2017/09/30 Python
Python实现破解12306图片验证码的方法分析
2017/12/29 Python
Python爬虫实现爬取百度百科词条功能实例
2019/04/05 Python
python点击鼠标获取坐标(Graphics)
2019/08/10 Python
pandas分批读取大数据集教程
2020/06/06 Python
HTML5+CSS3:3D展示商品信息示例
2017/01/03 HTML / CSS
Marmot土拨鼠官网:美国专业户外运动品牌
2018/01/11 全球购物
铭宣海淘转运:美国、日本、英国转运等全球转运公司
2019/09/10 全球购物
创业计划书的内容步骤和要领
2014/01/04 职场文书
竞选班干部演讲稿
2014/04/24 职场文书
离婚协议书怎么写
2014/09/12 职场文书
法人授权委托书公证范本
2014/09/14 职场文书
自愿离婚协议书范文2014
2014/10/12 职场文书
习近平在党的群众路线教育实践活动总结大会上的讲话
2014/10/21 职场文书
2014年纪委工作总结
2014/12/05 职场文书
2016新教师岗前培训心得体会
2016/01/08 职场文书
Python 批量下载阴阳师网站壁纸
2021/05/19 Python