zoukankan      html  css  js  c++  java
  • 二分模板

     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 }
  • 相关阅读:
    12-2 mysql 查询
    12-1 mysql的增删改减
    12-1 上午mysql 基本语句
    [题解] [FJOI2016] 建筑师
    [题解] [CF932E] TeamWork
    [题解] [Codechef] CNTDSETS
    [题解] [清华集训 2017] 榕树之心
    [题解] [AGC013D] Piling Up
    [题解] [CQOI2011] 放棋子
    [题解] [ZJOI2017] 仙人掌
  • 原文地址:https://www.cnblogs.com/zuiaimiusi/p/10829910.html
Copyright © 2011-2022 走看看