PHPer 面試指南-演算法篇

angkee發表於2018-01-25

本書的 GitHub 地址:https://github.com/todayqq/PHPerInterviewG...

演算法可以說是大廠的必考題,對於演算法,一定要理解其中的精髓、原理。

  • 氣泡排序

氣泡排序的原理:一組資料,比較相鄰資料的大小,將值小資料在前面,值大的資料放在後面。

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(array $list) {
    $len = count($list);
    if ($len <= 1) {
        return $list;
    }
    $pivotValue = $list[0];
    $left = array();
    $right = array();
    for ($i = 1; $i < $len; $i++) { 
        if ($list[$i] < $pivotValue) {
            $left[] = $list[$i];
        }else{
            $right[] = $list[$i];
        }
    }
    $left = quick_sort($left);
    $right = quick_sort($right);
    return array_merge($left, array($pivotValue), $right);
}
  • 二分查詢(折半查詢)

實現思想:將表中間位置記錄的關鍵字與查詢關鍵字比較,如果兩者相等,則查詢成功;否則利用中間位置記錄將表分成前、後兩個子表,如果中間位置記 錄的關鍵字大於查詢關鍵字,則進一步查詢前一子表,否則進一步查詢後一子表。

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 "查詢失敗";  
}

擴充套件閱讀

本作品採用《CC 協議》,轉載必須註明作者和本文連結

路漫漫其修遠,要走的路還很長

相關文章