二分法查找数据
在查找数据的时候除了暴力查找外,还可可以使用二分法查找,二分法查找又叫折半查找。二分法在查找的时候效率是比较高的,但是它有
局限性,就是仅适用于顺序表,不管是升序还是降序都适用。原理就是取顺序表的中间那个元素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 }
代码测试过了,结果如下: