标签:
判断数组中是否存在某个元素。
一、最通用的做法是,遍历整个数组,挨个元素进行比较。
function search_1($v,$array) { foreach ($array as $key => $value) { if($v == $value) return $key; echo $key,‘--‘,"\n"; } } $array = array(0,1,2,3,4,5,6,7,8,9); print_r(search_1(9,$array));
优:不必关心数组是索引数组还是关联数组或者是索引关联数组。
劣:需要遍历整个数组,耗时。
二、二分查找(折半查找)
function search_2($v,$array) { $min_k = 0; $max_k = count($array) - 1; while ($min_k <= $max_k) { $k = ceil(($max_k + $min_k) / 2); echo $k,‘--‘,"\n"; if($v < $array[$k]) { $max_k = $k - 1; //左边 }else if($v > $array[$k]) { $min_k = $k + 1; //右边 }else{ return $k; } } return false; } $array = array(0,1,2,3,4,5,6,7,8,9); print_r(search_2(9,$array));
优:速度快。
劣:数组元素必须是升序排列,可以是不连续的值,同时数组必须是索引数组,并且索引必须是连续的。
下面这个是二分法的递归版本。
function search_3($v,$array,$min_k,$max_k) { $result = false; $k = ceil(($min_k + $max_k) / 2); echo $k,‘--‘,"\n"; if($v == $array[$k]) { $result = $k; }else if($v < $array[$k]) { $result = search_3($v,$array,$min_k,$k-1); //左边 }else{ $result = search_3($v,$array,$k+1,$max_k); //右边 } return $result; }
下面是C语言版本的实现,因为正在学C,所以我先用我熟悉的PHP实现了一遍,然后再写的C版本。
#include <stdio.h> int binsearch_1(int v,int arr[],int max_k); int binsearch_2(int v, int arr[], int min_k, int max_k); main(){ int arr[10]; int i = 0; int max = 10; int result; for(i;i<max;i++) { arr[i] = i; } result = binsearch_1(9,arr,max-1); printf("%d\n", result); result = binsearch_2(9,arr,0,max-1); printf("%d\n", result); getchar(); } /** * 非递归版 */ int binsearch_1(int v, int arr[], int max_k) { int min_k = 0; int tmp_k; while(min_k <= max_k) { tmp_k = (min_k + max_k) / 2; printf("%d--\n", tmp_k); if(v < arr[tmp_k]) { max_k = tmp_k - 1; }else if(v > arr[tmp_k]){ min_k = tmp_k + 1; }else{ return tmp_k; } } return -1; }
/** * 递归版 */ int binsearch_2(int v, int arr[], int min_k, int max_k) { int result = -1; int tmp_k; tmp_k = (min_k + max_k) / 2; printf("%d--\n", tmp_k); if(v == arr[tmp_k]) { result = tmp_k; }else if(v < arr[tmp_k]) { result = binsearch_2(v, arr, min_k, tmp_k-1); }else{ result = binsearch_2(v, arr, tmp_k+1, max_k); } return result; }
标签:
原文地址:http://www.cnblogs.com/buexplain/p/4984627.html