二分查找思想:
1、前提条件:数组有序,且从小到大排序;
2、查找的val每次和中间数比较:
如果key小于mid ,查找mid左侧的数组部分;
如果key大于mid,则查找mid右侧的数组部分;
否则,比较相等,则直接返回mid。
代码如下:
#include <iostream>
using namespace std;
//非递归二分查找算法
int binary_search(int arr[], int len, int val)
{
if (arr == NULL || len == 0)
return -1;
int low, high, mid;
low = 0;
high = len-1;
while (low <= high)
{
mid = (low + high) / 2;
if (arr[mid] > val)
high = mid - 1;
else if (arr[mid] < val)
low = mid + 1;
else
return mid;
}
return -1;//返回-1表示查找失败
}
//递归二分查找算法
int binary_searchRecursion(int arr[],int low, int high, int val)
{
if (arr == NULL || high == 0)
return -1;
int mid = 0;
if (low <= high)
{
mid = (low + high) / 2;
if (arr[mid] > val)
{
return binary_searchRecursion(arr, low,mid-1, val);
}
else if (arr[mid] < val)
{
return binary_searchRecursion(arr, mid+1,high, val);
}
else
return mid;
}
return -1;
}
void main()
{
//数组初始化
int arr[20];
for (int i = 0; i < 20; i++)
{
arr[i] = i;
}
//非递归二分查找
cout << "Non-recursive Search: ";
cout << arr[binary_search(arr, 20, 7)] << endl;
//递归二分查找
cout << "Recursion Search: ";
cout << arr[binary_searchRecursion(arr, 0, 19, 14)] << endl;
system("pause");
}
输出结果: