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 相关文章推荐
实现分十页分向前十页向后十页的处理
Oct 09 PHP
PHP中,文件上传
Dec 06 PHP
PHP生成月历代码
Jun 14 PHP
PHP时间格式控制符对照表分享
Jul 23 PHP
php实现按文件名搜索文件的远程文件查找器
May 10 PHP
php实现改变图片直接打开为下载的方法
Apr 14 PHP
PHP实现自动识别原编码并对字符串进行编码转换的方法
Jul 13 PHP
Laravel 5.4.36中session没有保存成功问题的解决
Feb 19 PHP
php对象工厂类完整示例
Aug 09 PHP
thinkPHP5.0框架事务处理操作简单示例
Sep 07 PHP
php5对象复制、clone、浅复制与深复制实例详解
Aug 14 PHP
tp5框架使用cookie加密算法实现登录功能示例
Feb 10 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 空格,换行,跳格使用说明
2009/12/18 PHP
php+mongodb判断坐标是否在指定多边形区域内的实例
2016/10/28 PHP
PHP简单实现模拟登陆功能示例
2017/09/15 PHP
php使用yield对性能提升的测试实例分析
2019/09/19 PHP
php 利用socket发送GET,POST请求的实例代码
2020/07/04 PHP
jQuery EasyUI API 中文文档 - Tree树使用介绍
2011/11/19 Javascript
Javascript自定义排序 node运行 实例
2013/06/05 Javascript
jquery实现两个图片渐变切换效果的方法
2015/06/25 Javascript
jQuery生成假加载动画效果
2016/12/01 Javascript
JS中SetTimeout和SetInterval使用初探
2017/03/23 Javascript
原生js实现移动端触摸轮播的示例代码
2017/12/22 Javascript
详解ECMAScript typeof用法
2018/07/25 Javascript
深入浅析Node环境和浏览器的区别
2018/08/14 Javascript
Layui 设置select下拉框自动选中某项的方法
2018/08/14 Javascript
Vue封装的组件全局注册并引用
2019/07/24 Javascript
layui实现显示数据表格、搜索和修改功能示例
2020/06/03 Javascript
浅谈JavaScript中等号、双等号、 三等号的区别
2020/08/06 Javascript
javascript实现贪吃蛇游戏(娱乐版)
2020/08/17 Javascript
[36:09]Secret vs VG 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.24
2019/09/10 DOTA
python GUI实例学习
2017/11/21 Python
Python实现类似比特币的加密货币区块链的创建与交易实例
2018/03/20 Python
Python3 Tkinkter + SQLite实现登录和注册界面
2019/11/19 Python
python求一个字符串的所有排列的实现方法
2020/02/04 Python
python连接mongodb集群方法详解
2020/02/13 Python
PyQt5中QTableWidget如何弹出菜单的示例代码
2020/02/23 Python
解决pycharm安装第三方库失败的问题
2020/05/09 Python
python如何设置静态变量
2020/09/07 Python
CSS3 2D模拟实现摩天轮旋转效果
2016/11/16 HTML / CSS
社团活动总结书
2014/06/27 职场文书
泸县召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
健康状况证明模板
2014/10/23 职场文书
英文导游词
2015/02/13 职场文书
六一儿童节致辞稿(3篇)
2019/07/11 职场文书
python元组打包和解包过程详解
2021/08/02 Python
Java 在生活中的 10 大应用
2021/11/02 Java/Android
关于vue-router-link选择样式设置
2022/04/30 Vue.js