二分法查找的前提是:数组是有序的
二分查找算法是在有序数组中用到的较为频繁的一种算法,在未接触二分查找算法时,最通用的一种做法是,对数组进行遍历,跟每个元素进行比较,其时间为O(n).但二分查找算法则更优,因为其查找时间为O(lgn),譬如数组{1, 6, 7, 9, 23, 34, 36, 45, 69},查找元素36,用二分查找的算法执行的话,其顺序为:
1.第一步查找中间元素,即23,由于23<36,则36必然在23之后的数组元素中,那么就在{34, 36, 45, 69}中查找,
2.寻找{34, 36, 45, 69}的中位数,为36,即找到了。
二分查找算法就是不断将数组进行对半分割,每次拿中间元素和goal(目标数)进行比较。
具体代码实现如下:
#include"stdafx.h"
#include <iostream>
using namespace std;
int binary_search(int* x,int size,int goal)
{
int iLow=0;
int iHeight = size -1;
while(iLow<= iHeight)
{
int iMiddle = (iHeight - iLow)/2 + iLow;
if(x[iMiddle] > goal)
{
iHeight = iMiddle - 1;
}
else if(x[iMiddle] <goal)
{
iLow = iMiddle + 1;
}
else
{
return iMiddle;
}
}
return -1;
}
int main()
{
const int SIZE = 6000;
int a[SIZE];
for(int i =0;i < size; i++)
{
a[i] = i;
}
int iGoal = 3453;
int iIndex = binary_search(a,SIZE,iGoal);
if(iIndex != -1)
{
cout<<iGoal <<"在数组中的位置为"<<iIndex<<endl;
}
else
{
cout<<"该数在数组中不存在"<<endl;
}
return 0;
}