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