排序算法

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

 

posted @ 2020-05-26 16:24  懶得取名  阅读(117)  评论(0)    收藏  举报