先上代码
//二分查找,数组必须为有序的
int binarySearch(int key, int *a, int length)
{
int lo = 0;
int hi = length - 1;
//被查找的键要么不存在,要么必然存在于a[lo..hi]之中
while(lo <= hi)
{
int mid = lo + (hi - lo)/2;
if(key < a[mid])
hi = mid - 1;
else if(key > a[mid])
lo = mid + 1;
else
return mid;
}
return -1;
}
该函数接受一个整数键和一个已经有序的int数组及数组的大小作为参数。如果该键存在于数组中则返回它的索引,否则返回-1.
算法使用两个变量lo和hi,并保证如果键在数组中则它一定在a[lo..hi]中,然后方法进入一个循环,不断将数组的中间键(索引为mid)和被查找的键比较。如果被查找的键等于a[mid],返回mid,否则算法就将查找范围缩小一半,如果被查找的键小于a[mid]就继续在左半边查找,如果被查找的键大于a[mid]就继续在右半边查找。算法找到被查找的键或是查找范围为空时该过程结束。
二分查找之所以快事因为它只需检查很少几个条目(相对于数组的大小)就能够找到目标元素(或者确认目标元素不存在)。
我是用的开发环境为qt msvc 5.6.0来写的程序。下面看实现
//选择排序
void sort(int *a, int length)
{
int temp = 0;
for(int i = 0; i < length; ++i)
{
int min = i;
for(int j = i + 1; j < length; ++j)
{
if(a[j] < a[min])
min = j;
}
temp = a[i];
a[i] = a[min];
a[min] = temp;
}
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
//生成随机数
qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
int b[50] = {0};
for(int i=0; i<50; i++)
{
b[i] =qrand()%50;
cout << b[i] << " ";
}
//排序
sort(b, 50);
cout << endl << "-------------------------------" << endl;
for(int i = 0; i < 50; ++i)
{
cout << b[i] << " ";
}
int index = binarySearch(25, b, 50);
cout << endl << "-------------------------------" << endl;
qDebug() << "the key is:" << index;
return a.exec();c();
}
因为二分查找的前提是数组必须是有序的,所以这里写了个选择排序,这里不是专门讲排序的,也就不多说明了。
下面为运行结果:
查找的值是25,索引为17。