算法之二分查找法

原创 2016年08月29日 13:49:50

二分查找法

1.什么是二分查找法

二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。(From Baidu Baike)

2.二分查找的算法要求

①.数据必须有序排列;

②数据必须顺序存储。

3.二分查找的时间复杂度

O()=O(logn)

4.二分查找的实现原理

被查找的数据要先按顺序(这里是从小到大)存储在数组a里,并且知道要查找的数据key。

首先我们定义四个变量,分别为left,right,mid,ret。其中left、right和mid作为指向数组下标的变量,ret储存查找的结果(下标)并返回其值。

查找开始,首先让left和right指向数组的两端,并让ret为-1(返回-1表示没有查找到),求出left和right的中间值mid,比较数组a[mid]与被查找元素key的关系。

①若a[mid] = key,则表示找到被查找元素,查找结束;

②若a[mid] > key,则表示key应该比a[mid] 小,所以让right = mid -1,并继续查找;

③若a[mid] < key,则表示key应该比a[mid] 大,所以让left = mid + 1,并继续查找;


读者可以模拟查找一下

由此可见,整个查找的过程一直在继续,直到找到数据或者查找完数据,那么查找完数据的条件是什么呢?这里直接给出答案,有兴趣的读者可以写一段代码调试查看或者在纸上演算一下。

right > ltft

由上述条件可以得知,查找要放在一个循环里,或者用递归实现。下面给出代码。

5.二分查找的代码

/*
    Title: 二分查找(循环实现)
    Author:Pengwill
    Date:2016-08-29
    Blog:http://blog.csdn.net/pengwill97
*/
#include<stdio.h>
int main()
{
    int a[] ={1,5,6,8,9,10,15,16,17,51,56};//这里首先定义了一个有序的数组,如果无序,先排序
    int left,right,mid,ret,k;
    ret = -1;//初始化,-1表示没有查找到数据
    left = 0;
    right = sizeof(a)/sizeof(a[0]);
    scanf("%d",&k);//输入要查找的数据
    while(right>left){//注意循环的条件
        mid = (right+left)/2;
        if(a[mid]==k){
            ret = mid;
            break;
        }else if(a[mid] > k){
            right = mid-1;
        }else{
            left = mid+1;
        }
    }
    printf("%d",ret);
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

算法之二分查找法

二分查找法又名折半查找法,应用很广泛,因为1、其原理简单2、并且效率很高,属于基于比较的查找法中时间复杂度最低的,时间复杂度为O(log n)缺点是是查找的对像必须是有序的。二分查找法描述如下:A为一...
  • happysalay
  • happysalay
  • 2009年03月08日 21:45
  • 354

浅谈算法之二分查找法

二分查找算法 前言:   二分查找算法是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于或者小于中...
  • l_mloveforever
  • l_mloveforever
  • 2018年01月14日 23:36
  • 102

二分查找的算法思想和实现过程

1.二分查找: 又称为 折半查找,二分查找,适合对已经排序好的数据集合进行查找,时间复杂度O(log2n),效率高。假设有一升序的数据集合,先找出升序集合中最中间的元素,将数据集合划分为两个子集,将最...
  • xingbingle
  • xingbingle
  • 2016年06月24日 15:22
  • 1392

二分查找算法实例注释

/* * bs.cpp * * Created on: 2015年4月14日 * Author: judyge */ #include #include using nam...
  • judyge
  • judyge
  • 2015年04月14日 07:10
  • 338

php 二分查找法算法详解

一、概念:二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序...
  • xingjigongsi
  • xingjigongsi
  • 2014年08月04日 21:01
  • 1100

C++实现二分查找算法

想必二分查找很多人都不陌生,或许说很熟悉,但是在实际生活中又有很多人不能正确的写出它的相应代码,因为二分查找的边界条件等很难控制,下面我们来仔细的分析一下二分查找,这只是个人看法,如有异议,欢迎提出。...
  • Silence723
  • Silence723
  • 2016年07月27日 11:08
  • 3328

java算法总结之二分查找法

前提:要实现二分查找法的前提是有序的顺序存储结构.思想:二分查找法的实现思想是:将有序的集合分成三部分,前半部分,中间点,后半部分,首先用要查找的数据与中间点索引处的数据做比较,如果比中间点索引处的数...
  • u012233285
  • u012233285
  • 2017年12月26日 10:38
  • 9

Java实现算法之--二分查找法

/** * 执行递归二分查找,返回第一次出现该值的位置 * @param sortedData 已排序的数组 * @param start 开...
  • yayun0516
  • yayun0516
  • 2015年08月06日 21:39
  • 832

二分查找法过程详解

首先第一要素需要明白,二分查找法适用于有序数组,记住,二分查找之前一定要排序!!! 二分查找元素代码:int base=0; int top=size-1; while(base...
  • qq_24122385
  • qq_24122385
  • 2017年04月13日 15:56
  • 668

javascript中二分查找法的两种实现方式

一.利用函数的递归解决问题 //二分查找法 //封装成一个函数
  • ckshcjhacmsabcbba
  • ckshcjhacmsabcbba
  • 2015年04月27日 13:12
  • 794
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:算法之二分查找法
举报原因:
原因补充:

(最多只允许输入30个字)