PHP中常見的四種算法

分別用冒泡排序法,快速排序法,選擇排序法,插入排序法將下面數組中的值按照從小到大的順序進行排序。 15,33,5,89,6,4php

1.冒泡排序

原理分析:算法

  • 比較相鄰的元素。若是第一個比第二個大,就交換他們兩個。
  • 對每一對相鄰元素做一樣的工做,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。
  • 針對全部的元素重複以上的步驟,除了最後一個。
  • 持續每次對愈來愈少的元素重複上面的步驟,直到沒有任何一對數字須要比較。

代碼實現:數組

<?php /** * Created by PhpStorm. * User: admin * Date: 2017/10/30 * Time: 16:23 */ $arr = [15,33,5,89,6,4]; function bubbleSort($arr) { $count = count($arr); //該層循環控制 須要冒泡的輪數 for ($i=0; $i<$count; $i++) { //該層循環用來控制每輪 冒出一個數 須要比較的次數 for ($k=0; $k<$count-$i-1; $k++){ if($arr[$k]>$arr[$k+1]) { $tmp = $arr[$k+1]; $arr[$k+1] = $arr[$k]; $arr[$k] = $tmp; } } } return $arr; } var_dump(bubbleSort($arr));

最後結果:ui

array(6) { [0]=> int(4) [1]=> int(5) [2]=> int(6) [3]=> int(15) [4]=> int(33) [5]=> int(89) }

2.快速排序法

原理分析:spa

  • 經過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的全部數據都比另一部分的全部數據都要小,而後再按此方法對這兩部分數據分別進行快速排序,整個排序過程能夠遞歸進行,以此達到整個數據變成有序序列。

代碼實現:code

<?php /** * Created by PhpStorm. * User: admin * Date: 2017/10/30 * Time: 17:26 */ $arr = [15,33,5,89,6,4]; function quickSort($arr){ //判斷是否是還有進行 if (count($arr)>1){ //指定基準 $k = $arr[0]; //設置左邊數組 $x = []; //設置右邊數組 $y = []; for ($i=1; $i<count($arr); $i++) { //進行判斷 if ($k>$arr[$i]){ $x[] = $arr[$i]; }else{ $y[] = $arr[$i]; } } //遞歸執行 $x = quickSort($x); $y = quickSort($y); //合併數組 return array_merge($x,array($k),$y); }else { return $arr; } } var_dump(quickSort($arr));

最後結果:orm

array(6) { [0]=> int(4) [1]=> int(5) [2]=> int(6) [3]=> int(15) [4]=> int(33) [5]=> int(89) }

3.選擇排序法

原理分析:排序

  • 在數組中,選出最小的一個數與第一個位置的數交換。而後在剩下的數當中再找最小的與第二個位置的數交換,如此循環到倒數第二個數和最後一個數比較爲止。

代碼實現:遞歸

<?php /** * Created by PhpStorm. * User: admin * Date: 2017/10/30 * Time: 18:10 */ $arr = [15,33,5,89,6,4]; function selectSort($arr) { $count = count($arr); for($i=0; $i<$count-1; $i++) { //先假設最小的值的位置 $p = $i; for($j=$i+1; $j<$count; $j++) { //$arr[$p] 是當前已知的最小值 if($arr[$p] > $arr[$j]) { //比較,發現更小的,記錄下最小值的位置;而且在下次比較時採用已知的最小值進行比較。 $p = $j; } //已經肯定了當前的最小值的位置,保存到$p中。若是發現最小值的位置與當前假設的位置$i不一樣,則位置互換便可。 if($p != $i) { $tmp = $arr[$p]; $arr[$p] = $arr[$i]; $arr[$i] = $tmp; } } } //返回最終結果 return $arr; } var_dump(selectSort($arr));

最後結果:io

array(6) { [0]=> int(4) [1]=> int(5) [2]=> int(6) [3]=> int(15) [4]=> int(33) [5]=> int(89) }

4.插入排序法

原理分析:

  • 每步將一個待排序的紀錄,按其關鍵碼值的大小插入前面已經排序的文件中適當位置上,直到所有插入完爲止。

代碼實現:

<?php /** * Created by PhpStorm. * User: admin * Date: 2017/10/30 * Time: 18:20 */ $arr = [15,33,5,89,6,4]; function insertSort($arr) { $count = count($arr); for($i=1; $i<$count; $i++){ $tmp = $arr[$i]; //內層循環控制,比較並插入 for($j=$i-1;$j>=0;$j--) { if($tmp < $arr[$j]) { //發現插入的元素要小,交換位置,將後邊的元素與前面的元素互換 $arr[$j+1] = $arr[$j]; $arr[$j] = $tmp; } else { //若是碰到不須要移動的元素,因爲是已經排序好是數組,則前面的就不須要再次比較了。 break; } } } return $arr; } var_dump(insertSort($arr));

最後結果:

array(6) { [0]=> int(4) [1]=> int(5) [2]=> int(6) [3]=> int(15) [4]=> int(33) [5]=> int(89) }

算法是一門高深的學問 :)

相關文章
相關標籤/搜索