您当前的位置:首页 > 分类 > 技术资讯 > PHP > 正文

PHP排序算法

发布时间:2013-10-09 15:34:58      来源:51推一把
【摘要】对于PHP中对数组的元素进行排序,这个是很经常用到的,之前的项目中也有,而且对于几种排序我们都是用的是asort  arsort 等PHP原生函数,没有自己去实现,所以就对一下的几个函数进行总结,这个会不断的进行补充,自己也可以好好的复习和总结。 直接上代码吧

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

<?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; 

   
/* 
 * 选择排序(一维数组) 
 * 每一趟从待排序的数据元素中选出最小(最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。 
 */ 
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<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); 
    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($arrKeyMap as $val) 
            { 
                    $arrReturn[] =$arrKey[$val]; 
            } 
        } 
        return$arrReturn; 
    } 

  
  
/** 
  * 使用原生的函数进行数组按照值进行排列 
  */ 
functionarraySortByVal($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的基础类中来进行。