zoukankan      html  css  js  c++  java
  • 二分查找

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

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

    function search_1($v,$array) {
        foreach ($array as $key => $value) {
            if($v == $value) return $key;
            echo $key,'--',"
    ";
        }
    }
    
    $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,'--',"
    ";
            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,'--',"
    ";
        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
    ", result);
        result = binsearch_2(9,arr,0,max-1);
        printf("%d
    ", 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--
    ", 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-- ", 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; }

  • 相关阅读:
    scala 基本语法
    HBase架构深度解析
    scala 面向对象之 继承
    探索 ConcurrentHashMap 高并发性的实现机制
    Spark 源码和应用开发环境的构建
    spark内存管理详解
    2020软件工程第一次作业 L
    实验 1:Mininet 源码安装和可视化拓扑工具 L
    代码阅读方法
    生活中的小感悟
  • 原文地址:https://www.cnblogs.com/buexplain/p/4984627.html
Copyright © 2011-2022 走看看