分治法--二分查找

分治
分治法是将一个规模为n的问题分解为k个规模较小的子问题。注意:这里的子问题一定是相互独立且与原问题相同。用递归的方法解这些子问题。然后将各子问题的解合并到原问题的解。
二分查找算法是运用分治的典型例子
分治-二分查找
给定已按升序排好序的n个元素a[0:n-1],现要在这n个元素中找出一特定元素x。
分析
据此容易设计出二分搜索算法:
在 a[0] <= a[1] <= ... <= a[n-1] 中搜索 x, 找到x时返回其在数组中的位置,否则返回-1

int binarySearch(int a[], int x, int n)
{
int left = 0; int right = n - 1;
//分别为最左边位置与最右边位置
while (left <= right) {
int middle = (left + right)/2;//中间位置
if (x == a[middle]) return middle;
if (x > a[middle]) left = middle + 1;
else right = middle - 1;
//比较中间元素与X的大小关系 若x > a[middle]说明左
半区间元素都小于X,目标位置在右半区间,整体区间转
为右半区间,反之整体区间转为左半区间
}
return -1; // 未找到x
}

 例如:

#include<iostream>

using namespace std;

#include<algorithm>

int Bifind(int a[],int x,int n)//二分查找

{

    int l=0,r=n-1;

    while(l<=r)

    {

        int m=(l+r)/2;

        if(x==a[m])return m;

        if(x>a[m])l=m+1;

        else r=m-1;

    }

    return -1;

}

int main()

{

    //freopen("d:\\1.txt","r",stdin);

    int a[20],b[20],i,j=0;

    int x;

    cin>>x;

    cout<<x<<endl;

    for(i=0;i<20;i++)

    {

     cin>>a[i];

     b[j++]=i;

     cout<<a[i]<<' ';

    }

    cout<<endl;

    for(j=20-1;j>=0;j--)

    for(i=0;i<j;i++)

    {

        if(a[i]>a[i+1])

        {

            int temp=a[i];

            a[i]=a[i+1];

            a[i+1]=temp;

            temp=b[i];

            b[i]=b[i+1];

            b[i+1]=temp;

        }

    }

    for(i=0;i<20;i++)

    cout<<a[i]<<' ';

    cout<<endl;    

    if(Bifind(a,x,20)==-1)

     cout<<"未查找到:"<<endl;

     else cout<<b[Bifind(a,x,20)]+1<<endl; 

    return 0;

}

 

 

 

你可能感兴趣的:(二分查找)