PHP排序算法的复习和总结
生活随笔
收集整理的這篇文章主要介紹了
PHP排序算法的复习和总结
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
對于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] = $key;? 119 ????????} 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的基礎類中來進行。
轉載于:https://www.cnblogs.com/vlizheng/p/5748458.html
總結
以上是生活随笔為你收集整理的PHP排序算法的复习和总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sublime linux下无法输入中文
- 下一篇: 当PDF页面总数不确定的时候导出PDF增