許多人說演算法是程式的核心,演算法的好壞決定了程式的品質。作為一個初級phper,雖然很少接觸到演算法方面的東西。但是對於基本的排序演算法還是應該掌握的,它是程式開發的必備工具。這裡介紹冒泡排序,插入排序,選擇排序,快速排序四種基本演算法,分析演算法的思路。
前提:分別用冒泡排序法,快速排序法,選擇排序法,插入排序法將下面數組中的值按照從小到大的順序進行排序。 $arr(1,43,54,62,21,66,32,78,36,76,39);
1. 冒泡排序
思路分析:在要排序的一組數中,對當前還未排好的序列,從前往後對相鄰的兩個數依次進行比較和調整,讓較大的數往下沉,較小的往上冒。即,每當兩相鄰的數比較後發現它們的排序與排序要求相反時,就將它們互換。
- $arr=array(1,43,54,62,21,66,32,78,36,76,39);
- function bubbleSort($ arr)
- {
- $len=count($arr);
- //此層循環控制需要冒泡的輪數
- for($i=1;$i { //此層迴圈用來控制每輪冒出一個數需要比較的次數
- for($k=0;$k {
- if($arr[$k]>$arr[$k 1])
- {
- $tmp=$arr[$k 1];
- $arr[$k 1]=$ arr[$k];
- $arr[$k]=$tmp;
- }
- }
- }
- return $arr;
- }
複製程式碼
2. 選擇排序
思路分析:在要排序的一組數中,選出最小的一個數與第一個位置的數交換。然後在剩下的數當中再找最小的與第二個位置的數交換,如此循環到倒數第二個數和最後一個數比較為止。
- function selectSort($arr) {
- //雙循環完成,外層控制輪數,內層控制比較次數
- $len=count( $arr);
- for($i=0; $i//先假設最小的值的位置
- $p = $i;
-
- for($j=$i 1; $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;
- }
複製代碼
3.插入排序
思路分析:在要排序的一組數中,假設前面的數已經是排好順序的,現在要把第n個數插到前面的有序數中,使得這n個數也是排好順序的。如此反覆循環,直到全部排好順序。
- function insertSort($arr) {
- $len=count($arr);
- for($i=1, $i$tmp = $arr[$i];
- //內層循環控制,比較並插入
- for($j=$i-1;$j>=0;$ j--) {
- if($tmp //發現插入的元素要小,交換位置,後邊的元素與前面的元素互換
- $ arr[$j 1] = $arr[$j];
- $arr[$j] = $tmp;
- } else {
- //如果碰到不需要移動的元素,由於是已經排序好是數組,則前面的就不需要再比較了。
- break;
- }
- }
- }
- return $arr;
- }
複製程式碼
4.快速排序
思路分析:選擇一個基準元素,通常選擇第一個元素或最後一個元素。透過一班掃描,將待排序列分成兩部分,一部分比基準元素小,一部分大於等於基準元素。此時基準元素在其排好序後的正確位置,然後再用同樣的方法遞歸地排序劃分的兩部分。
- function quickSort($arr) {
- //先判斷是否需要繼續進行
- $length = count($arr);
- if( $length return $arr;
- }
- //選擇第一個元素作為基準
- $base_num = $arr[0];
- //遍歷除了標尺外的所有元素,依照大小關係放入兩個陣列內
- //初始化兩個陣列
- $left_array = array(); //小於基準的
- $right_array = array(); //大於基準的
- for($i=1; $iif($base_num > $arr[$i]) {
- //放入左邊陣列
- $left_array[] = $arr[$i];
- } else {
- //放入右邊
- $right_array[] = $arr[$i];
- }
- }
- //再分別對左邊和右邊的陣列進行相同的排序處理方式遞歸呼叫這個函數
- $left_array = quick_sort($left_array);
- $right_array = quick_sort($right_array);
- $right_array = quick_sort($right_array);
- //合併
- return array_merge($left_array, array($base_num), $right_array);
}
複製程式碼
| 來源:
php100