二分法查找数据

Posted buanxu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二分法查找数据相关的知识,希望对你有一定的参考价值。

    在查找数据的时候除了暴力查找外,还可可以使用二分法查找,二分法查找又叫折半查找。二分法在查找的时候效率是比较高的,但是它有

局限性,就是仅适用于顺序表,不管是升序还是降序都适用。原理就是取顺序表的中间那个元素mid,然后用中间的元素mid和待查找元素x进

行比较大小,以此改变下次的查找区间,使得下次的查找区间缩短一半,所以它又叫折半查找,这样就可节省一半的时间,极大的提高了效率。

    在百度上找了张二分法查找的图,看一下具体是怎么实现的,上图

技术图片

    然后再用代码来实现,上代码

 1 #include<iostream>
 2 using namespace std;
 3 
 4 int binarySearch(int a[],int x,int N)   //二分查找;x为待查找元素,N为有序表大小
 5 {  //a虽然为顺序表,但可能是升序,也可能是降序,所以要两种情况;通过比较首尾元素大小即可
 6     if(a[0]<a[N-1])      //此顺序表是升序     
 7     {
 8        int left=0,right=N-1,mid;
 9        while(left<=right)
10        {
11            mid=(left+right)/2;
12            if(x==a[mid]) 
13                  return  mid;  //查找成功返回就返回索引
14            else if(x<a[mid])
15                  right=mid-1;
16            else
17                  left=mid+1;
18         }
19     }
20     else   //此顺序表为降序
21     {
22         int left=0,right=N-1,mid;
23        while(left<=right)
24        {
25            mid=(left+right)/2;
26            if(x==a[mid]) 
27                  return  mid;  //查找成功返回就返回索引
28            else if(x>a[mid])
29                  right=mid-1;
30            else
31                  left=mid+1;
32         }
33     }
34     return -1;  //查找失败
35 }
36 int main()
37 {
38     int index;
39     int a[10]={1,2,3,4,5,6,7,8,9,10};
40     int b[10]={10,9,8,7,6,5,4,3,2,1};
41     index=binarySearch(a,5,10);
42     if(index==-1)
43         cout<<"查找失败"<<endl;
44     else
45         cout<<"查找成功,结果为:"<<a[index]<<"   索引为:"<<index<<endl;
46     index=binarySearch(b,5,10);
47     if(index==-1)
48         cout<<"查找失败"<<endl;
49     else
50         cout<<"查找成功,结果为:"<<b[index]<<"   索引为:"<<index<<endl;
51     return 0;
52 }

 

代码测试过了,结果如下:

技术图片

以上是关于二分法查找数据的主要内容,如果未能解决你的问题,请参考以下文章

数据结构之二分查找

数据结构和算法三个“二分查找”练习

C言语二分查找(折半查找)算法及代码

关于二分查找中的一些问题

(王道408考研数据结构)第七章查找-第二节2:二分查找及其判定树

二分查找