二分查找又称折半查找;
要求:
1.必须采用顺序存储结构;
2.必须按关键字大小有序排列;
优点:
- 比较次数少,查找速度快,平均性能好;
缺点:
- 要求待查表为有序表,且插入删除困难;-
二分查找算法就是不断将数组进行对半分割,每次拿中间元素和要查找的数进行比较;
#include <iostream>
using namespace std;
//二分查找(非递归版本)
int search(int* a, int len, int goal)
{
int left = 0;
int right = len - 1;
while(left <= right)
{
int mid = (left + right)>>1;//位运算节省时间
if(a[mid] == goal)
return mid;
else if(a[mid] > goal)//在左半边
high = mid - 1;
else //在右半边
low = mid + 1;
}
//没找到
return -1;
}
//递归版本
int Search(int *a,int left,int right,int goal)
{
if (left<=right)
{
int mid = (left+right)>>1;
if(goal == a[mid])
return mid;
else if(goal<a[mid])
return Search(a,left,mid-1,goal);
else if(goal>a[mid])
return Search(a,mid+1,right,goal);
}
else
return -1;
}
int main()
{
const int LEN = 10000;
int a[LEN];
for(int i = 0; i < LEN; i++)
a[i] = i - 5000;
int goal = 0;
int index1 = search(a, LEN, goal);
if(index1 != -1)
cout<<goal<<"在数组中的下标为"<<search(a, LEN, goal)<<endl;
else
cout<<"不存在"<<goal<<endl;
int index2= Search(a, 0, len-1,len, goal);
if(index2 != -1)
cout<<goal<<"在数组中的下标为"<<Search(a, 0, len-1,len, goal)<<endl;
else
cout<<"不存在"<<goal<<endl;
return 0;
}