您的位置:首页 > 其它

二分查找

2015-11-21 20:03 405 查看
判断数组中是否存在某个元素。

一、最通用的做法是,遍历整个数组,挨个元素进行比较。

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;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: