二分搜索

来源:互联网 发布:用js修改css样式 编辑:程序博客网 时间:2024/05/17 01:57
二分搜索法,它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用O(log n)完成搜索任务。它的基本思想是,将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比较,如果x=a[n/2]则找到x,算法终止。如果x<a[n/2],则我们只要在数组a的左半部继续搜索x(这里假设数组元素呈升序排列)。如果x>a[n/2],则我们只要在数组a的右半部继续搜索x。二分搜索法的应用极其广泛,而且它的思想易于理解,但是要写一个正确的二分搜索算法也不是一件简单的事。第一个二分搜索算法早在1946年就出现了,但是第一个完全正确的二分搜索算法直到1962年才出现。Bentley在他的著作《Writing Correct Programs》中写道,90%的计算机专家不能在2小时内写出完全正确的二分搜索算法。问题的关键在于准确地制定各次查找范围的边界以及终止条件的确定,正确地归纳奇偶数的各种情况,其实整理后可以发现它的具体算法是很直观的,我们可用C++描述如下:  
#include"iostream.h"int main(){   int bs(int a[],int y,int n);    int a[10]={1,5,6,32,36,56,62,74,98,150};    int y=56;    int i=bs(a,62,10);    cout<<"我求的是在数组a,a[10]={1,5,6,32,36,56,62,74,98,150}中找数字56的位置"<<endl;    if(i==-1) cout<<"这个数不在数组中"<<endl;    else cout<<"这个数是数组的第"<<i+1<<"个数"<<endl;    return 0;}int bs(int a[],int y,int n){int right=n-1;int left=0;int midd;while(left<=right){midd=(left+right)/2;if(y==a[midd])return midd;if(y>a[midd])left=midd+1;elseright=midd-1;}return -1;}

原创粉丝点击