1.順序查找
思路分析: 從數組的第一個元素開始一個一個向下查找,如果有和目標一致的元素,查找成功;如果到最后一個元素仍沒有目標元素,則查找失敗。
代碼實現:
<?php function search($arr,$k){
$n = count($arr); $arr[$n]= $k; for($i=0; $i<$n; $i++){ if($arr[$i]==$k){ break; } } if ($i<$n){ return $i; }else{ return -1; } }
2.二分查找
思路分析:先取數組中間的值floor((low+top)/2), 然后通過與所需查找的數字進行比較,若比中間值大,則將首值替換為中間位置下一個位置,繼續第一步的操作;若比中間值小,則將尾值替換為中間位置上一個位置,繼續第一步操作 ,重復第二步操作直至找出目標數字。
代碼實現:
// 非遞歸 // $target是要查找的目標 $arr是已經排序好的數組 function binary(&$arr,$low,$top,$target){ while($low <= $top){ //由於php取商是有小數的,所以向下取整,不過也可不加,數組也會取整 $mid = floor(($low+$top)/2); echo $mid."<br>"; if($arr[$mid]==$target){ return $arr[$mid]; }elseif($arr[$mid]<$target){ $low = $mid+1; }else{ $top = $mid-1; } } return -1; }
// 遞歸 function binaryRecursive($arr,$low,$top,$target){ if($low<=$top){ $mid = floor(($low+$top)/2); if($arr[$mid]==$target){ return $arr[$mid]; }elseif($arr[$mid]<$target){ return binaryRecursive($arr,$mid+1,$top,$target); }else{ return binaryRecursive($arr,$low,$top-1,$target); } }else{ return -1; } }
3.寫一個二維數組排序算法函數,可以調用php內置函數,能夠具有通用性。
代碼實現:
function array_sort($arr, $keys, $order=0) { if (!is_array($arr)) { return false; } $keysvalue = array(); foreach($arr as $key => $val) { $keysvalue[$key] = $val[$keys]; } if($order == 0){ asort($keysvalue); }else { arsort($keysvalue); } reset($keysvalue); foreach($keysvalue as $key => $vals) { $keysort[$key] = $key; } $new_array = array(); foreach($keysort as $key => $val) { $new_array[$key] = $arr[$val]; } return $new_array; }
4.寫一個函數,能夠遍歷一個文件下的所有文件和子文件夾
代碼實現:
<?php function my_scandir($dir){ $files = array(); if($handle = opendir($dir)) { while (($file = readdir($handle))!== false) { if($file != '..' && $file != '.') { if(is_dir($dir."/".$file)){ $files[$file]=my_scandir($dir."/".$file); }else{ $files[] = $file; } } } closedir($handle); return $files; } }
5.歸並排序
代碼實現:
function Merge(&$arr, $left, $mid, $right) { $i = $left; $j = $mid + 1; $k = 0; $temp = array(); while ($i <= $mid && $j <= $right) { if ($arr[$i] <= $arr[$j]) $temp[$k++] = $arr[$i++]; else $temp[$k++] = $arr[$j++]; } while ($i <= $mid) $temp[$k++] = $arr[$i++]; while ($j <= $right) $temp[$k++] = $arr[$j++]; for ($i = $left, $j = 0; $i <= $right; $i++, $j++) $arr[$i] = $temp[$j]; } function MergeSort(&$arr, $left, $right) { if ($left < $right) { $mid = floor(($left + $right) / 2); MergeSort($arr, $left, $mid); MergeSort($arr, $mid + 1, $right); Merge($arr, $left, $mid, $right); } }
還有部分其他類型的算法面試題參考:
1.http://blog.csdn.net/caleng/article/details/5276403
2.http://www.cnblogs.com/jackluo/p/3139770.html
部分摘自網絡 ,待驗證。