折半查找在数据结构算法中是一个比较实用的算法。
但是它是一个只能用于查找有顺序的数,这并不影响它的使用,可以先实现一个排序再进行查找。
折半查找比较简单,但是注意的点也比较多。
下面我将用递归和非递归两种方法进行实现。
非递归:
在取头尾时有两种选择:左闭右闭[begin,end],左闭右开[begin,end)
这两个不同的选择会影响后面的条件判断
时间复杂度O(log2N)
int BinarySearch(int len,int* arr,int x)
{
assert(arr);
int begin = arr[0];
int end = len;
while (begin < end)
{
int mid = ((end - begin) >> 2) + begin;
if (arr[mid] < x)
{
begin = mid + 1;
}
else if (arr[mid]>x)
{
end = mid - 1;
}
else
{
return mid;
}
return -1;
}
}
int main()
{
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int len = sizeof(arr) / (sizeof(arr[0]));
cout << BinarySearch(10, arr, 1) << endl;
cout << BinarySearch(10, arr, 2) << endl;
cout << BinarySearch(10, arr, 3) << endl;
cout << BinarySearch(10, arr, 4) << endl;
cout << BinarySearch(10, arr, 5) << endl;
cout << BinarySearch(10, arr, 6) << endl;
cout << BinarySearch(10, arr, 7) << endl;
cout << BinarySearch(10, arr, 8) << endl;
cout << BinarySearch(10, arr, 9) << endl;
cout << BinarySearch(10, arr, 10) << endl;
cout << BinarySearch(10, arr, 11) << endl;
}
下面这个代码是左闭右开的情况,它在while里begin <= end,在if里将mid直接赋值给begin和end
int BinarySearch(int len, int* arr, int x)
{
assert(arr);
int begin = arr[0];
int end = len + 1;
while (begin <= end)
{
int mid = ((end - begin) >> 2) + begin;
if (arr[mid] < x)
{
begin = mid;
}
else if (arr[mid]>x)
{
end = mid;
}
else
{
return mid;
}
return -1;
}
}
int main()
{
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int len = sizeof(arr) / (sizeof(arr[0]));
cout << BinarySearch(10, arr, 1) << endl;
cout << BinarySearch(10, arr, 2) << endl;
cout << BinarySearch(10, arr, 3) << endl;
cout << BinarySearch(10, arr, 4) << endl;
cout << BinarySearch(10, arr, 5) << endl;
cout << BinarySearch(10, arr, 6) << endl;
cout << BinarySearch(10, arr, 7) << endl;
cout << BinarySearch(10, arr, 8) << endl;
cout << BinarySearch(10, arr, 9) << endl;
cout << BinarySearch(10, arr, 10) << endl;
cout << BinarySearch(10, arr, 11) << endl;
}
递归:
同样非递归也分两种:左闭右闭和左闭右开,在这里我急就只介绍一种,选择了我喜欢的,在你们写的话只要分清楚两种就好int BinarrySearch(int* arr, int x, int begin, int end,int len)
{
assert(arr);
begin = arr[0];
end = len + 1;
while (begin < end)
{
if (begin > end)
{
return -1;
}
int mid = begin + (end - begin) >> 1;
if (arr[mid] < x)
{
return BinarrySearch(arr, x, mid + 1, end);
}
else if (arr[mid] > x)
{
return BinarrySearch(arr, x, begin, mid - 1);
}
else
{
return mid;
}
}
}
我就是看着代码简单,根本没有当做一回事,以至于犯了错误,
希望能对你们有用,千万不要小看任何一个简单的代码