频道栏目
首页 > 资讯 > 算法 > 正文

常见PHP排序算法的复习和总结

16-01-07        来源:[db:作者]  
收藏   我要投稿

对于PHP中对数组的元素进行排序,这个是很经常用到的,之前的项目中也有,而且对于几种排序我们都是用的是asort arsort 等PHP原生函数,没有自己去实现,所以就对一下的几个函数进行总结,这个会不断的进行补充,自己也可以好好的复习和总结。

直接上代码

/*
* 插入排序(一维数组)
* 每次将一个待排序的数据元素,插入到前面已经排好序的数列中的适当的位置,使数列依然有序;直到待排序的数据元素全部插入完成为止。
*/
functioninsertSort($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;
}
 
/*
* 选择排序(一维数组)
* 每一趟从待排序的数据元素中选出最小(最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。
*/
functionselectSort($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;
}
 
/*  
* 冒泡排序(一维数组)
* 两两比较待排序数据元素的大小,发现两个数据元素的次序相反即进行交换,直到没有反序的数据元素为止
*/
functionbubbleSort($array){
$count=count($array);
if($count<= 0) {
returnfalse;
}
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;
}
 
/*
* 快速排序(一维数组)
*
*/
functionquickSort($array){
if(count($array) <= 1){
return$array;
}
$key=$array[0];
$left_arr=array();
$right_arr=array();
for($i=1;$i
  if($array[$i] <=$key){
   $left_arr[] =$array[$i];
  }else{
 $right_arr[] =$array[$i];
}
}
$left_arr= quickSort($left_arr);
$right_arr= quickSort($right_arr);
returnarray_merge($left_arr,array($key),$right_arr);
}
 
/**
* 按照元素的值进行排序
* strOrder 为排列的顺序 asc 升序 desc 降序
*/
functionsortByVal($arr,$strOrder='asc')
{
if(!is_array($arr) ||count($arr)==0)
{
return$arr;
}
 
$arrReturn=array();
foreach($arras$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($arrKeyMapas$val)
{
$arrReturn[] =$arrKey[$val];
}
}
return$arrReturn;
}
}
 
 
/**
* 使用原生的函数进行数组按照值进行排列
*/
functionarraySortByVal($arr,$keys,$type='asc'){
$keysvalue=$new_array=array();
foreach($arras$k=>$v){
$keysvalue[$k] =$v[$keys];
}
if($type=='asc'){
asort($keysvalue);
}else{
arsort($keysvalue);
}
reset($keysvalue);
foreach($keysvalueas$k=>$v){
$new_array[$k] =$arr[$k];
}
return$new_array;

对于下面的2个对于array的值进行排序的方法一个是自己实现的一个是使用了原生的PHP函数的,其实排序对于少量数据一般就单页的数据量的数据还是可以的,如果涉及到大量的数据的排序,建议可以整合到MYSQL的基础类中来进行。

相关TAG标签
上一篇:谈谈PHP树生成迷宫及A*自动寻路算法
下一篇:算法导论:选择排序的原理与实现
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站