二分查找法也称为折半查找法,它的思想是每次都与序列的中间元素进行比较。二分查找的一个前提条件是数组是有序的,假设数组array为递增序列,findData为要查找的数,n为数组长度,首先将n个元素分成个数大致相同的两半,取array[n/2]与将要查找的值findData进行比较,如果findData等于array[n/2],则找到findData,算法终止;如果 findData < array[n/2],则只要在数组array的左半部分继续搜索findData;如果findData > array[n/2],则只需要在数组array的右半部分继续搜索即可。
具体实现如下:
#include <iostream>
// 非递归(如果存在,则返回数组位置;不存在,则返回 -1)
int BinarySearch(int arr[], int len, int findData)
{
if (arr == NULL || len <= 0)
return -1;
int start = 0;
int end = len - 1;
while (start <= end)
{
int mid = start + (end - start)/2;
if (findData == arr[mid])
return mid;
else if (findData < arr[mid])
end = mid - 1;
else
start = mid + 1;
}
return -1;
}
// 递归
int BinarySearch2(int arr[], int start, int end, int findData)
{
if (start > end)
return -1;
int mid = start + (end - start)/2;
if (findData == arr[mid])
return mid;
if (findData < arr[mid])
return BinarySearch2(arr, start, mid - 1, findData);
if (findData > arr[mid])
return BinarySearch2(arr, mid + 1, end, findData);
return -1;
}
int BinarySearch2(int arr[], int len, int findData)
{
if (arr == NULL || len <= 0)
return -1;
return BinarySearch2(arr, 0, len - 1, findData);
}
int main(int argc, const char * argv[]) {
int arr[] = {1,2,3,4,5,6,7,8};
int len = sizeof(arr)/sizeof(int);
// 非递归
int index1 = BinarySearch(arr, len, 3);
printf("%d\n", index1);
// 递归
int index2 = BinarySearch2(arr, len, 6);
printf("%d\n", index2);
return 0;
}
输出如下: