实现一个函数,在一个已排好序的整型数组中进行二分搜索,找到给定整数的数组下标。是用下面的方法声明:
int BinarySearch(int array[], int lower, int upper, int target);
讨论这种搜索的效率,并与其他搜索方法进行比较。
程序实现的代码如下:
#include "stdafx.h"
#include <iostream.h>
#define E_TARGET_NOT_IN_ARRAY -1
#define E_ARRAY_UNORDERED -2
#define E_LIMITS_REVERSED -3
int BinarySearch(int array[], int lower, int upper, int target)
{
int center, range;
range = upper - lower;
if(range < 0)
{
return E_LIMITS_REVERSED;
}
else if(range == 0 && array[lower] != target)
{
return E_TARGET_NOT_IN_ARRAY;
}
if(array[lower] > array[upper])
{
return E_ARRAY_UNORDERED;
}
center = (range / 2) + lower;
if(target == array[center])
{
return center;
}
else if(target < array[center])
{
return BinarySearch(array, lower, center - 1, target);
}
else
{
return BinarySearch(array, center + 1, upper, target);
}
}
int iterBinarySearch(int array[], int lower, int upper, int target)
{
int center, range;
if(lower > upper)
return E_LIMITS_REVERSED;
while(1)
{
range = upper - lower;
if(range == 0 && array[lower] != target)
return E_TARGET_NOT_IN_ARRAY;
if(array[lower] > array[upper])
return E_ARRAY_UNORDERED;
center = (range / 2) + lower;
if(target == array[center])
{
return center;
}
else if(target < array[center])
{
upper = center - 1;
}
else
{
lower = center + 1;
}
}
}
int main()
{
int a[] = {1, 3, 5, 6, 9, 12, 27, 89, 229, 301};
for(int i = 0; i < 10; i++)
cout << a[i] << ' ';
cout << endl;
int b = BinarySearch(a, 0, 9, 8);
cout << "递归方法查找到的数字下标为:" << b << endl;
int c = iterBinarySearch(a, 0, 9, 12);
cout << "非递归方法查找到的数字下标为:" << c << endl;
return 0;
}
程序的执行结果如下:
二分搜索的时间复杂度为O(log(n)),因为每次迭代都排除了一半要搜索的元素。这比简单搜索所有元素更有效率,简单搜索的时间复杂度为O(n)。
但是,为了进行二分搜索,数组必须已经排好序,这个操作的时间复杂度通常是O(nlog(n)),除非这个数组总是按顺序存放。