使用递归实现对一个无序集合元素的二分查找,假设已经有一个排序函数,供你直接使用,所以你不需要自己实现一个排序函数,保证代码可读性、易于维护、有一定的健壮性。
#define Len(a) ( (sizeof(a)) / (sizeof(a[0])) )
bool g_iUsort = true; //标志位,未排序
int comp(const void* a, const void* b)
{
return *(int*)a - *(int*)b;
}
bool getBisearch(int a[], int length, int value_find)
{
if (a==NULL || length<=0)
return false;
if (g_iUsort) //进行一次排序
{
qsort(a, length, sizeof(int), comp); //调用库函数中的快速排序
g_iUsort = false;
}
int start = 0, end = length-1;
int mid = (start+end)/2;
if (start<=end)
{
if (a[mid]>value_find)
getBisearch(a, mid, value_find);
else if (a[mid]<value_find)
getBisearch(&a[mid+1], end-mid, value_find);
else return true;
}
else
{
return false;
}
}
void main()
{
int a[] = {3,0,1,6,8}; //无序数组
bool hasValue = false;
hasValue = getBisearch(a, Len(a), 3);
if (hasValue)
puts("存在!");
else puts("不存在!");
}