二分查找算法

二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

算法要求:

1.必须采用顺序存储结构

.2.必须按关键字大小有序排列。

下面是c++与java的不同实现:

已经假设所查询数组均为升序排列好了:

C++版:

#include <iostream>
#include <stdlib.h>
#define  ERROR -1
#define LEN 10
using namespace std;
/************************************************************************/
/*  T  自定义数据类型
 value 查找的值
 low  左侧边界 (一般为0)
 high    右侧边界(一般为数组长度-1)
/************************************************************************/
template <class T>
int binarySearch(T table[],T value,int low,int hign){
 if(low<=hign){//边界有效
  int mid = (low+hign)/2; //找到中间点
  if(table[mid]==value){//如果中间点的值就是我们查找的值,则返回该点
   return mid;
  }else if(table[mid]>value){//如果中间值比查找值大,则证明查找的值在中间点的左侧
   return binarySearch(table,value,low,mid-1);//继续将范围缩小到原来一半(靠左缩小)
  }else{
   return binarySearch(table,value,mid+1,hign);//继续将范围缩小到原来一半(靠右缩小)
  }
 }
 return ERROR;
}
/************************************************************************/
/* 由上述代码可以知道,上边界和和下边界其实就是数组的开始和结束位置,因此上述函数可以泛化为下列函数                                                                    */
/************************************************************************/
template <class T>
int binarySearch(T table[],int n,T value){
 return binarySearch(table,value,0,n-1);
}
template <class T>
void print(T table[],int n){
 for (int i=0;i<n;i++)
 {
  cout<<table[i]<<" ";
 }
 cout<<"\n";
}
int main(void){

 //给出一个已经排序好的数组
 int array[LEN] = {0};
 for (int i=0;i<LEN;i++)
 {
  array[i] = i+10;
 }
 cout<<"您要查找的序列为:";
 print(array,LEN);
 cout<<"请输入你要查找的内容:";
 int search;
 cin>>search;
 //调用函数
 int searchResult = binarySearch(array,LEN,search);
 cout<<"查找内容为"<<search<<"在指定数组的第"<<(searchResult+1)<<"处"<<endl;
 system("pause");
 return 1;
}

相关推荐