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 25 PHP
php按百分比生成缩略图的代码分享
May 10 PHP
php正则匹配html中带class的div并选取其中内容的方法
Jan 13 PHP
PHP代码优化技巧小结
Sep 29 PHP
Zend Framework实现多服务器共享SESSION数据的方法
Mar 22 PHP
PHP 5.6.11中CURL模块问题的解决方法
Aug 08 PHP
PHP基本语法实例总结
Sep 09 PHP
Yii框架实现记录日志到自定义文件的方法
May 23 PHP
PHP实现的基于单向链表解决约瑟夫环问题示例
Sep 30 PHP
ecshop添加菜单及权限分配问题
Nov 21 PHP
PHP使用PDO操作sqlite数据库应用案例
Mar 07 PHP
laravel 出现command not found问题的解决方案
Oct 23 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中的实现trim函数代码
2007/03/19 PHP
php中XMLHttpRequest(Ajax)不能设置自定义的Referer的解决方法
2011/11/26 PHP
php将图片保存为不同尺寸图片的图片类实例
2015/03/30 PHP
Laravel 5框架学习之Blade 简介
2015/04/08 PHP
WordPress主题制作中自定义头部的相关PHP函数解析
2016/01/08 PHP
PHP实现将几张照片拼接到一起的合成图片功能【便于整体打印输出】
2017/11/14 PHP
ThinkPHP5.1框架页面跳转及修改跳转页面模版示例
2019/05/06 PHP
Laravel Eloquent分表方法并使用模型关联的实现
2019/11/25 PHP
PHP isset()及empty()用法区别详解
2020/08/29 PHP
Google韩国首页图标动画效果
2007/08/26 Javascript
基于Jquery+Ajax+Json的高效分页实现代码
2011/10/29 Javascript
JS判断当前日期是否大于某个日期的实现代码
2012/09/02 Javascript
JavaScript控制Session操作方法
2013/01/17 Javascript
JS中实现replaceAll的方法(实例代码)
2013/11/12 Javascript
javascript函数特点实例分析
2015/05/14 Javascript
JS实现滑动菜单效果代码(包括Tab,选项卡,横向等效果)
2015/09/24 Javascript
jquery实现简洁文件上传表单样式
2015/11/02 Javascript
jQuery 3 中的新增功能汇总介绍
2016/06/12 Javascript
Google 地图API Map()构造器详解
2016/08/06 Javascript
js原生跨域_用script标签的简单实现
2016/09/24 Javascript
Easyui Datagrid自定义按钮列(最后面的操作列)
2017/07/13 Javascript
基于Vue.js 2.0实现百度搜索框效果
2020/12/28 Javascript
利用JS测试目标网站的打开响应速度
2017/12/01 Javascript
AngularJS发送异步Get/Post请求方法
2018/08/13 Javascript
JS立即执行函数功能与用法分析
2019/01/15 Javascript
用Cordova打包Vue项目的方法步骤
2019/02/02 Javascript
如何实现js拖拽效果及原理解析
2020/05/08 Javascript
vue 获取url参数、get参数返回数组的操作
2020/11/12 Javascript
Python的Tornado框架异步编程入门实例
2015/04/24 Python
Python实现的爬取豆瓣电影信息功能案例
2019/09/15 Python
浅谈如何使用python抓取网页中的动态数据实现
2020/08/17 Python
大学生个人求职口试自我评价
2014/02/16 职场文书
校园演讲稿汇总
2014/05/21 职场文书
社区党员志愿服务活动方案
2014/08/18 职场文书
一次性工伤赔偿协议书范本
2014/11/25 职场文书
CentOS7 minimal 最小化安装网络设置过程
2022/12/24 Servers