码迷,mamicode.com
首页 > 其他好文 > 详细

二分查找

时间:2015-11-21 21:16:54      阅读:243      评论:0      收藏:0      [点我收藏+]

标签:

判断数组中是否存在某个元素。

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

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!