本書的 GitHub 地址:https://github.com/todayqq/PHPerInterviewGuide
演算法可以說是大廠的必考題,對於演算法,一定要理解其中的精髓、原理。
- 氣泡排序
氣泡排序的原理:一組資料,比較相鄰資料的大小,將值小資料在前面,值大的資料放在後面。
function bubble_sort($arr)
{
$count = count($arr);
if (0 == $count) {
return false;
}
for($i = 0; $i < $count; $i++){
for($j = 0; $j< $count-1-$i; $j++){
  if($arr[$j] > $arr[$j+1]){
  $temp = $arr[$j];
  $arr[$j] = $arr[$j+1];
  $arr[$j+1] = $temp;
  }
   }
}
return $arr;
}
複製程式碼
這樣的一個陣列 array(6, 3, 8, 2, 9, 1)
,排序過程是怎樣的?細節問題不在過多論述,有興趣可以從擴充套件閱讀中尋找答案。
- 快速排序
快速排序是對氣泡排序的一種改進。
實現思想是:通過一趟排序將待排記錄分割成獨立的兩部分,其中一部分的關鍵字均比另一部分記錄的關鍵字小,則可分別對這兩部分記錄繼續進行快速排序,整個排序過程可以遞迴進行,以達到整個序列有序的目的。
簡單來說就是:找到當前陣列中的任意一個元素(一般選擇第一個元素),作為標的,新建兩個空陣列,遍歷整個陣列元素,如果遍歷到的元素比當前的元素要小,那麼就放到左邊的陣列,否則放到右面的陣列,然後再對新陣列進行同樣的操作。
function quick_sort($arr) {
$count = count($arr);
if(1 >= $count) {
return arr;
}
$base_num = $arr[0]; //選擇標的
$left_array = array();//小於標的
$right_array = array();//大於標的
for($i = 1; $i < $count; $i++) {
if($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);
//最終合併
return array_merge($left_array, array($base_num), $right_array);
}
複製程式碼
- 二分查詢(折半查詢)
實現思想:將表中間位置記錄的關鍵字與查詢關鍵字比較,如果兩者相等,則查詢成功;否則利用中間位置記錄將表分成前、後兩個子表,如果中間位置記 錄的關鍵字大於查詢關鍵字,則進一步查詢前一子表,否則進一步查詢後一子表。
function binSearch($arr, $target){
$height = count($arr)-1;
$low = 0;
while($low <= $height){
$mid = floor(($low+$height)/2);//獲取中間數
//兩值相等,返回
if($arr[$mid] == $target){
return $mid;
//元素比目標大,查詢左部
} elseif ($arr[$mid] < $target){
$low = $mid + 1;
//元素比目標小,查詢右部
} elseif ($arr[$mid] > $target){
$height = $mid - 1;
}
}
return "查詢失敗";
}
複製程式碼