码迷,mamicode.com
首页 > 编程语言 > 详细

PHP排序算法的复习和总结

时间:2016-08-08 12:29:10      阅读:233      评论:0      收藏:0      [点我收藏+]

标签:

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

直接上代码吧!

  1 <?php
  2 /*
  3  * 插入排序(一维数组)
  4  * 每次将一个待排序的数据元素,插入到前面已经排好序的数列中的适当的位置,使数列依然有序;直到待排序的数据元素全部插入完成为止。
  5  */
  6 function insertSort($arr){
  7     if(!is_array($arr) || count($arr)==0){
  8         return $arr;
  9     }
 10     $count = count($arr);
 11     for($i=1; $i<$count; $i++){
 12         if(isset($arr[$i])){
 13         $tmp = $arr[$i]; //获取后一个元素的值
 14         $j = $i - 1; //获取前面的下标
 15         while($arr[$j] > $tmp){ //如果前面一个比后面一个大, 这里是从小到大
 16             $arr[$j+1] = $arr[$j]; //把小的元素和前面的对换,直到移动到合适的位置,在移动下一个
 17             $arr[$j] = $tmp;
 18             $j--;
 19         }
 20         }
 21     }
 22     return $arr;
 23 }
 24   
 25 /*
 26  * 选择排序(一维数组)
 27  * 每一趟从待排序的数据元素中选出最小(最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。
 28  */
 29 function selectSort($arr){
 30     if(!is_array($arr) || count($arr) == 0)
 31     {
 32         return $arr;
 33     }
 34     $count = count($arr);
 35     for($i=0; $i<$count; $i++){
 36         $k = $i;
 37         for($j=$i+1; $j<$count; $j++){
 38       if ($arr[$k] > $arr[$j])
 39         $k = $j; //找出最小的
 40         if ($k != $i){
 41             $tmp = $arr[$i];
 42             $arr[$i] = $arr[$k];
 43             $arr[$k] = $tmp;
 44           }
 45        }
 46     }
 47     return $arr;
 48 }
 49  
 50 /*  
 51  * 冒泡排序(一维数组)
 52  * 两两比较待排序数据元素的大小,发现两个数据元素的次序相反即进行交换,直到没有反序的数据元素为止
 53  */
 54 function bubbleSort($array){
 55     $count = count($array);
 56     if ($count <= 0) {
 57         return false;
 58     }
 59     for($i=0; $i<$count; $i++){
 60         for($j=$count-1; $j>$i; $j--){
 61            if ($array[$j] < $array[$j-1]){ //比较找到的数进行交换
 62             $tmp = $array[$j];
 63             $array[$j] = $array[$j-1];
 64             $array[$j-1] = $tmp;
 65            }
 66         }
 67     }
 68     return $array;
 69 }
 70   
 71 /*
 72  * 快速排序(一维数组)
 73  *
 74  */
 75 function quickSort($array){
 76     if (count($array) <= 1){
 77         return $array;
 78     }
 79     $key = $array[0];
 80     $left_arr = array();
 81     $right_arr = array();
 82     for ($i=1; $i<count($array); $i++){
 83       if ($array[$i] <= $key){
 84            $left_arr[] = $array[$i];
 85       }else{
 86          $right_arr[] = $array[$i];
 87         }
 88     }
 89     $left_arr = quickSort($left_arr);
 90     $right_arr = quickSort($right_arr);
 91     return array_merge($left_arr, array($key), $right_arr);
 92 }
 93  
 94 /**
 95   * 按照元素的值进行排序
 96   * strOrder 为排列的顺序 asc 升序  desc 降序
 97   */
 98 function sortByVal($arr,$strOrder=‘asc‘)
 99 {
100     if(!is_array($arr) || count($arr)==0)
101     {
102         return $arr;
103     }
104  
105     $arrReturn = array();
106     foreach($arr as $key=>$val)
107     {
108         $arrKey[] = $key;
109         $arrVal[] = $val;
110     }
111  
112     $count = count($arrVal);
113     if($count)
114     {
115         //创建key的顺序数组
116         for($key=0;$key<$count;$key++)
117         {
118             $arrKeyMap[$key] = $key119         }
120         //对值进行排序
121         for($i=0;$i<$count;$i++)
122         {  
123              
124             for($j = $count-1; $j>$i;$j--)
125             {
126                 //<从小到大排列 升降在这修改
127                 $bol = $strOrder == ‘asc‘ ? $arrVal[$j]<$arrVal[$j-1] : $arrVal[$j]>$arrVal[$j-1];
128                 if($bol){
129                     $tmp = $arrVal[$j];
130                     $arrVal[$j] = $arrVal[$j-1];
131                     $arrVal[$j-1] = $tmp;
132                     //值的冒泡排序,引起key的数组的交互   
133                     $keytmp = $arrKeyMap[$j];
134                     $arrKeyMap[$j] = $arrKeyMap[$j-1];
135                     $arrKeyMap[$j-1] = $keytmp;
136                 }
137             }
138         }
139         if(count($arrKeyMap))
140         {
141             foreach ($arrKeyMap as $val)
142             {
143                     $arrReturn[] = $arrKey[$val];
144             }
145         }
146         return $arrReturn;
147     }
148 }
149  
150  
151 /**
152   * 使用原生的函数进行数组按照值进行排列
153   */
154 function arraySortByVal($arr,$keys,$type=‘asc‘){
155     $keysvalue = $new_array = array();
156     foreach ($arr as $k=>$v){
157         $keysvalue[$k] = $v[$keys];
158     }
159     if($type == ‘asc‘){
160         asort($keysvalue);
161     }else{
162         arsort($keysvalue);
163     }
164     reset($keysvalue);
165     foreach ($keysvalue as $k=>$v){
166         $new_array[$k] = $arr[$k];
167     }
168     return $new_array;
169 }

 

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

PHP排序算法的复习和总结

标签:

原文地址:http://www.cnblogs.com/vlizheng/p/5748458.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!