排序算法
1 $arr = [1,43,56,78,2,5,98,2,12]; 2 3 // 冒泡排序 4 function bubble_sort($arr){ 5 $l = count($arr); 6 for($i = 0;$i < $l-1;$i++){ 7 for($j = 0;$j < $l-1-$i;$j++){ 8 if($arr[$j] > $arr[$j + 1]){ 9 $a = $arr[$j]; 10 $arr[$j] = $arr[$j + 1]; 11 $arr[$j + 1] = $a; 12 } 13 } 14 } 15 return $arr; 16 } 17 // var_dump(bubble_sort($arr)); 18 19 20 // 选择排序 21 function selection_sort($arr){ 22 $count = count($arr); 23 for($i = 0;$i < $count - 1;$i++){ 24 for($j = $i + 1;$j < $count;$j++){ 25 if($arr[$i] > $arr[$j]){ 26 $a = $arr[$i]; 27 $arr[$i] = $arr[$j]; 28 $arr[$j] = $a; 29 } 30 } 31 } 32 return $arr; 33 } 34 // var_dump(selection_sort($arr)); 35 36 37 // 插入排序 38 function charu($arr){ 39 $l = count($arr); 40 for($i = 1;$i < $l;$i++){ 41 if($arr[$i] < $arr[$i - 1]){ 42 $a = $arr[$i]; 43 $arr[$i] = $arr[$i - 1]; 44 $j = $i - 1 - 1; 45 while($a < $arr[$j]){ 46 $arr[$j + 1] = $arr[$j]; 47 --$j; 48 } 49 $arr[$j + 1] = $a; 50 } 51 } 52 return $arr; 53 } 54 // var_dump(charu($arr)); 55 56 57 // 快速排序 58 function quick_sort($arr){ 59 $k = count($arr); 60 if($k < 2){ 61 return $arr; 62 } 63 $key = $arr[0]; 64 $left = []; 65 $right = []; 66 for($i = 1;$i < $k;$i++){ 67 if($arr[$i] < $key){ 68 $left[] = $arr[$i]; 69 } 70 if($arr[$i] > $key){ 71 $right[] = $arr[$i]; 72 } 73 } 74 $left = quick_sort($left); 75 $right = quick_sort($right); 76 return array_merge($left,array($key),$right); 77 } 78 // var_dump(quick_sort($arr)); 79 80 81 // 归并排序 82 function merge_sort($arr){ 83 $len = count($arr); 84 if($len == 1){ 85 return $arr; 86 } 87 $mid = $len / 2; 88 $left = array_slice($arr,0,$mid); 89 $right = array_slice($arr,$mid); 90 $left = merge_sort($left); 91 $right = merge_sort($right); 92 return merge($left,$right); 93 } 94 function merge($left,$right){ 95 $res = []; 96 while(count($left) > 0 && count($right) > 0){ 97 if($left[0] > $right[0]){ 98 $res[] = $right[0]; 99 $right = array_slice($right,1); 100 }else{ 101 $res[] = $left[0]; 102 $left = array_slice($left,1); 103 } 104 } 105 while(count($left) > 0){ 106 $res[] = $left[0]; 107 $left = array_slice($left,1); 108 } 109 while(count($right) > 0){ 110 $res[] = $right[0]; 111 $right = array_slice($right,1); 112 } 113 return $res; 114 } 115 // var_dump(merge_sort($arr)); 116 117 118 // 希尔排序 119 function shell_sort($arr){ 120 $l = count($arr); 121 $f = 3; 122 $h = 1; 123 while($h < intval($l/$f)){ 124 $h = $f * $h + 1; 125 } 126 while($h >= 1){ 127 for($i = $h;$i < $l;$i++){ 128 for($j = $i;$j >= $h;$j -= $h){ 129 if($arr[$j] > $arr[$j-$h]){ 130 $temp = $arr[$j]; 131 $arr[$j] = $arr[$j-$h]; 132 $arr[$j-$h] = $temp; 133 } 134 } 135 } 136 $h = intval($h/$f); 137 } 138 return $arr; 139 } 140 // var_dump(shell_sort($arr)); 141 142 143 // 计数排序 144 function count_sort($arr){ 145 $l = count($arr); 146 $max = max($arr); 147 148 149 $frequency = new SplFixedArray($max + 1); 150 for($i = 0;$i < $l;$i++){ 151 if(empty($frequency[$arr[$i]])){ 152 $frequency[$arr[$i]] = 0; 153 } 154 $frequency[$arr[$i]] += 1; 155 } 156 157 158 $arr = []; 159 for($i = 0;$i < count($frequency);$i++){ 160 if(!empty($frequency[$i])){ 161 for($j = 0;$j < $frequency[$i];$j++){ 162 $arr[] = $i; 163 } 164 } 165 } 166 return $arr; 167 } 168 // var_dump(count_sort($arr)); 169 170 171 // 桶排序 172 function bucket_sort($arr){ 173 $min = min($arr); 174 $max = max($arr); 175 176 177 $kl = array_fill($min,$max - $min + 1,0); 178 179 180 foreach($arr as $k => $v){ 181 $kl[$v] += 1; 182 } 183 $arr = []; 184 foreach($kl as $k => $v){ 185 for($i = 0;$i < $v;$i++){ 186 $arr[] = $k; 187 } 188 } 189 return $arr; 190 } 191 // var_dump(bucket_sort($arr)); 192 193 194 // 基数排序 195 function radix_sort($arr){ 196 //创建二维数组 下标为 0~9 197 $kl = array_fill(0,10,[]); 198 //获取数组个数 199 $count = count($arr); 200 // 数组的最大值 201 $max = max($arr); 202 // 最大值的长度 203 $len = strlen($max); 204 for($i = 0;$i < $len;$i++){ 205 // 获取10的$i次方 206 $p = pow(10,$i); 207 for($j = 0;$j < $count;$j++){ 208 // 获取对应位数上的数 209 $mod = ($arr[$j] / $p) % 10; 210 // 放入二维数组中 211 $kl[$mod][] = $arr[$j]; 212 } 213 // 把传入的数组($arr)清空 214 $arr = []; 215 foreach($kl as $k => $v){ 216 // 合并数组 217 $arr = array_merge($arr,$v); 218 // 把二维数组($kl)清空 219 $kl[$k] = []; 220 } 221 } 222 return $arr; 223 } 224 // var_dump(radix_sort($arr));