数据结构基础 查找 之 二分查找

【算法思想】

二分查找又称折半查找,对排好序的数组,每次取这个数和数组中间的数进行比较,复杂度是O(logn)

如:设数组为a[n],查找的数x,

如果x==a[n/2],则返回n/2;

如果x < a[n/2],则在a[0]到a[n/2-1]中进行查找;

如果x > a[n/2],则在a[n/2+1]到a[n-1]中进行查找;

优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。

条件:查找的数组必须要为有序数组。

【递归方法源码】

/*
arrat:数组 , low:上界;  high:下界;  target:查找的数据; 返回target所在数组的下标
*/
int binarySearch(int array[], int low, int high, int target) {
    int middle = (low + high)/2;
    if(low > high) {
        return -1;
    }
    if(target == array[middle]) {
        return middle;
    }
    if(target < array[middle]) {
        return binarySearch(array, low, middle-1, target);
    }
    if(target > array[middle]) {
        return binarySearch(array, middle+1, high, target);
    }
} 

【非递归方法源码】

/*
arrat:数组 , n:数组的大小;  target:查找的数据; 返回target所在数组的下标
*/
int binarySearch2(int array[], int n, int target) {
    int low = 0, high = n, middle = 0;
    while(low < high) {
        middle = (low + high)/2;
        if(target == array[middle]) {
            return middle;
        } else if(target < array[middle]) {
            high = middle;
        } else if(target > array[middle]) {
            low = middle + 1;
        }
    }
    return -1;
}  

递归与非递归方法,应该注意到,递归方式high是上界,也就是array的lenth()-1,二非递归的方法是size()是上界誒,也就是array的lenth()。这一点一定要引起重视!

【STL方法实现二分查找】

STL中关于二分查找的函数主要有三个,分别是lower_bound/upper_bound/

binary_search。这三个函数都运用于有序区间,当然这也是二分查找思想运用的前提,下面逐一对这三个函数进行剖析。

这三个函数都包含在算法库中,因此首先应该包含头文件,如下所示:

#include <algorithm>
using namespace std;

lower_bound算法返回一个非递减序列[first, last)中的第一个大于等于val的位置。

upper_bound算法返回一个非递减序列[first, last)中的第一个大于val的位置。

ForwardIter lower_bound(ForwardIter first, ForwardIter last,const _Tp& val)
ForwardIter upper_bound(ForwardIter first, ForwardIter last, const _Tp& val)
ForwardIterator lower_bound (ForwardIterator first, ForwardIterator last,
                             const T& val, Compare comp);
ForwardIterator upper_bound (ForwardIterator first, ForwardIterator last,
                             const T& val, Compare comp);

STL源码实现

template<class ElementType>
int BinarySearch(ElementType *pData,int First,int Last,ElementType Key)
{
    while (First<=Last)      //最后一次循环是通过First=Last来定位Key的
    {
        Middle=(First+Last)/2;
        if (pData[Middle]==Key)
            return Middle;
        if (pData[Middle]>Key)
            Last=Middle-1;//在左子区间找key
        else
            First=Middle+1;//在右子区间找key
    }
    return -1;//没有找到
}

参考详址:

http://blog.csdn.net/luoweifu/article/details/16656737

http://blog.csdn.net/u012878643/article/details/46723609

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-07 16:39:34

数据结构基础 查找 之 二分查找的相关文章

【数据结构与算法】二分查找

基本思想 首先将给定的值K与表中中间位置元素比较,若相等,则查找成功:若不等,则所需查找的元素只能在中间数据以外的前半部分或者后半部分,缩小范围后继续进行同样的查找,如此反复,直到找到为止. 代码实现 /** * 源码名称:BinarySearch.java * 日期:2014-08-14 * 程序功能:二分查找 * 版权:[email protected] * 作者:A2BGeek */ public class BinarySearch { public static int binaryS

2. C#数据结构与算法 -- 查找算法(顺序查找,哈希查找,二分查找(折半),索引,二叉)

1. 顺序查找算法 ===================================================== 算法思想简单描述: 最突出的查找类型就是从记录集的开始处顺次遍历每条记录,直到找到所要的记录或者是 到达数据集的末尾.这就是所谓的顺序查找.顺序查找(也被称为线性查找)是非常容易实现 的.从数组的起始处开始,把每个访问到的数组元素依次和所要查找的数值进行比较.如果找 到匹配的数据项,就结束查找操作.如果遍历到数组的末尾仍没有产生匹配,那么就说明此数 值不在数组内. ==

看数据结构写代码(53) 静态查找表(线性查找,二分查找,斐波那契查找,插值查找)

查找定义:根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录). 查找表分类:静态查找表和动态查找表. 静态查找表:只查找,而不进行插入,删除. 动态查找表:在查找过程中同时插入查找表中不存在的数据元素,或者从查找表中删除已经存在的某个数据元素. 静态表的 查找 大致 四种 算法: 线性查找,二分查找,斐波那契查找和插值查找. 其中 在线性查找之前,对表 无要求.对于 其余三种 需要 在查找之前 排序.插值查找 除了 需要 排序,还需要 均匀分布. 下面 给出代码: 线性查

算法-基础和查找-1.汉诺塔/2.顺序查找/3.二分查找/4.顺序查找和二分查找的比较

1.汉诺塔: 如下图所示,需要将A柱子中的所有圆盘按照从小到大的顺序移动到C柱子上,并且在移动过程中大圆盘不能在小圆盘上面 分析问题:最终希望呈现的结果是将A柱子上的盘子全部按照从小到大的顺序移动到C柱子上 1.n个盘子,将n-1视为一个整体 2.将n-1个盘子视为一个盘子从a经过c移动到b 3.将n从a移动到c 4.将n-1个盘子从b经过a移动到c 5.结束条件:n>0 代码如下: 1 def hanoi(n, a, b, c): 2 if n > 0: 3 hanoi(n-1, a, c,

顺序查找和二分查找

1.使用PHP描述顺序查找和二分查找(也叫做折半查找)算法,顺序查找必须考虑效率,对象可以是一个有序数组[转] 2.顺序查找 <?php//$n为待查找的数组元素的个数,$k为待查找的元素function seq_sch($array, $n, $k){ $array[$n] = $k; for($i=0; $i<$n; $i++){ if($array[$i]==$k){ return true;break; } } if ($i<$n) //判断是否到数组的末尾{ return $i

【Java_Base】常用查找算法:顺序查找、二分查找

顺序查找 从第一个元素开始顺序比较查找. 二分查找 二分查找前提条件: 已排序的数组中查找 二分查找的基本思想是: 首先确定该查找区间的中间点位置: int mid = (low+upper) / 2; 然后将待查找的值与中间点位置的值比较: 若相等,则查找成功并返回此位置. 若中间点位置值大于待查值,则新的查找区间是中间点位置的左边区域. 若中间点位置值小于待查值,则新的查找区间是中间点位置的右边区域. 下一次查找是针对新的查找区间进行的. 1 public class Search{ 2 p

查找系列之简述顺序查找和二分查找

顺序查找和二分查找 一.顺序查找思想 1. 从表的一端开始扫描,顺序扫描线性表,依次扫描到的结点关键字与给定的值K相比较.如果当前扫描到的结点的关键字与给定的值K相等,则查找成功;若扫描结束后,仍未找到关键字与给定的值K相等,则查找失败; 2.顺序查找既适用于顺序存储结构,也适用于线性表的链式存储结构; 3.ASL= (n+1)/2为其平均查找长度 4.优点:算法简单,对存储结构形式没有要求 缺点:浪费空间,当长度非常大是效率低 5.算法描述: /** *顺序查找 *@param int a[]

动态数组,数组初始化,数组内存释放,向数组中添加一个元素,向数组中添加多个元素,数组打印,顺序查找,二分查找,查找数组并返回地址,冒泡排序,改变数组中某个元素的值,删除一个数值,删除所有,查找含有

 1定义接口: Num.h #ifndef_NUM_H_ #define_NUM_H_ #include<stdio.h> #include<stdlib.h> /************************************************************************/ /*数组的结构体类型                                                    */ /*******************

对分查找法(二分查找法,折半查找法)

二分查找法是针对已经排好序的序列进行查找 每次折半查找 算法时间复杂度,对于长度为N的序列,每次执行N/2,假设k次结束,最后到第一个N/2^k=0,所以k=logN 时间复杂度logN int binarysearch(const int array[], int x, int N) { int low, mid, high; low = 0, high = N - 1; while (low <= high) { mid = (low + high) / 2; if(array[mid] <

Java中常用的查找算法——顺序查找和二分查找

Java中常用的查找算法——顺序查找和二分查找 一.顺序查找: a) 原理:顺序查找就是按顺序从头到尾依次往下查找,找到数据,则提前结束查找,找不到便一直查找下去,直到数据最后一位. b) 图例说明: 原始数据:int[] a={4,6,2,8,1,9,0,3}; 要查找数字:8 代码演示: import java.util.Scanner; /* * 顺序查找 */ public class SequelSearch { public static void main(String[] arg