二分模板

 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 const int N=10000;
 5 int a[N],n,x;
 6 int binarysearch(int a[],int x,int left,int right)
 7 {
 8     if(left>right)return -1;
 9     int mid=(left+right)/2;
10     if(x==a[mid])return mid+1;
11     if(x<a[mid])
12        return binarysearch(a,x,left,mid-1);
13     else//即为x>a[mid]
14        return binarysearch(a,x,mid+1,right);
15 }
16 //下面写一下二分的简化代码,共有两种
17 int bsearch_1(int a[],int x,int l,int r)
18 {
19     //与上面的代码相比,这里将a[mid]==x的情况不分开讨论
20     //通过while循环实现递归
21     while(l<r)//>=x最小的值
22     {
23         int mid=l+r>>1;
24         if(a[mid]<x)l=mid+1;
25         else
26             r=mid;
27     }
28     return l+1;
29 }
30 int bsearch_2(int a[],int x,int l,int r)
31 {//<=x最大的值
32     while(l<r)
33     {
34         int mid=l+r+1>>1;
35         if(a[mid]<=x)l=mid;
36         else
37             r=mid-1;
38     }
39     return l+1;
40 }
41 int main()
42 {
43     cout<<"二分查找一定要在有序序列中进行,当然输入非有序序列,也可将其先排列为有序"<<endl;
44     cout<<"n=";
45     cin>>n;
46     cout<<"需要搜索的数组:";
47     for(int i=0;i<n;i++)
48         cin>>a[i];
49     sort(a,a+n);
50     cout<<"排列好的有序数组为:";
51     for(int i=0;i<n;i++)
52         cout<<a[i]<<" ";
53     cout<<endl<<"需要搜索的数:";
54     cin>>x;
55     cout<<"该数在有序数组中的位置为:"<<endl<<"方法1:"<<binarysearch(a,x,0,n-1)<<endl;
56     cout<<"方法2:"<<bsearch_1(a,x,0,n-1)<<endl<<"方法3:"<<bsearch_2(a,x,0,n-1);
57     return 0;
58 }
原文地址:https://www.cnblogs.com/zuiaimiusi/p/10829910.html