分治法二分查找

分治
分治法是将一个规模为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;
}

 

原文地址:https://www.cnblogs.com/hsqdboke/p/2467303.html