有序数组的二分查找:
非递归形式
int BinSeach(int a[], int n, int values)
{
int index = -1;
int start = 0;
int finish = n - 1;
int middle;
while (start <= finish)
{
middle = (start + finish) / 2;
if (a[middle] < values)
start = middle + 1;
else if (a[middle] == values)
{
index = middle; break;
}
else
finish = middle - 1;
}
return index;
}
递归形式
int BinSearch(int a[], int start, int finish, int values)
{
int middle = (start + finish) / 2;
if (start <= finish)
{
if (a[middle] < values)
{
start = middle + 1;
return BinSearch(a, start, finish, values);
}
else if (a[middle] == values)
return middle;
else
finish = middle - 1;
return BinSearch(a, start, finish, values);
}
else
return -1;
}
旋转数组的二分查找:
非递归形式
int BinSeach(int a[], int n, int values)
{
int index = -1;
int start = 0;
int finish = n - 1;
int middle;
while (start <= finish)
{
middle = (start + finish) / 2;
if (a[middle]<values)
{
if (a[middle] >= a[start])
{
start = middle + 1;
}
else
{
if (a[start] < values)
{
finish = middle - 1;
}
else if(a[start] > values)
{
start = middle + 1;
}
else
{
return start;
}
}
}
else if (a[middle] == values)
{
index = middle;
break;
}
else
{
if (a[middle] < a[start])
{
finish = middle - 1;
}
else
{
if (a[start] < values)
{
finish = middle - 1;
}
else if (a[start] > values)
{
start = middle + 1;
}
else
{
return start;
}
}
}
}
return index;
}
递归:
int BinSearchXZDG(int a[], int start, int end, int target)
{
int middle = (start + end) / 2;
if (a[middle]>=a[start])
{
if (a[start]<target && a[middle]>target)
{
end = middle - 1;
BinSearchXZDG(a, start ,end, target);
}
else if (a[start] == target)
{
return start;
}
else if (a[middle] == start)
{
return middle;
}
else
{
start= middle + 1;
BinSearchXZDG(a, start, end, target);
}
}
else
{
if (a[start]>target && a[middle]<target)
{
start = middle + 1;
BinSearchXZDG(a, start, end, target);
}
else if (a[start] == target)
{
return start;
}
else if (a[middle] == start)
{
return middle;
}
else
{
end = middle - 1;
BinSearchXZDG(a, start, end, target);
}
}
}