Day 10 - Pre-Knowledge for Binary Search
Day10 - 二分查找前置知识
Last updated
Day10 - 二分查找前置知识
Last updated
#include <iostream>
using namespace std;
// 二分查找算法
int binarySearch(int arr[], int L, int R, int target)
{
while (L <= R)
{
// 计算中间位置索引
int Mid = (L + R) / 2;
// 如果中间位置元素等于目标值,则返回索引
if(arr[Mid] == target)
{
return Mid;
}
// 如果中间位置元素小于目标值
else if(arr[Mid] < target)
{
// 更新左边界为中间位置索引+1
L = Mid + 1; // 确保L有机会大于R
}
// 如果中间位置元素大于目标值
else if(arr[Mid] > target)
{
// 更新右边界为中间位置索引-1
R = Mid - 1; // 确保R有机会小于L
}
}
// L > R,表示没有找到目标值,返回-1
return -1;
}
int main(void)
{
// 测试代码
int arr[] = {1, 2, 3, 5, 8, 13, 21};
int n = sizeof(arr) / sizeof(arr[0]);
int target = 13;
int result = binarySearch(arr, 0, n - 1, target);
if (result == -1)
{
cout << "Target is not present in array" << endl;
}
else
{
cout << "Target is present at index " << result << endl;
}
return 0;
}#include <iostream>
using namespace std;
// 递归法:
int binarySearchRecursive(int arr[], int L, int R, int target)
{
// 没有找到目标值,返回-1
if (L > R)
{
return -1;
}
int Mid = (L + R) / 2;
// 如果中间位置元素等于目标值,结束递归,返回索引
if (arr[Mid] == target)
{
return Mid;
}
// 如果中间位置元素小于目标值,继续递归去右边区间[Mid+1, R]
else if (arr[Mid] < target)
{
return binarySearchRecursive(arr, Mid + 1, R, target);
// 实则 Mid + 1 == L
}
// 如果中间位置元素大于目标值,继续递归去左边区间[L, Mid-1]
else if (arr[Mid] > target)
{
return binarySearchRecursive(arr, L, Mid - 1, target);
// 实则 Mid - 1 == R
}
return 0; // 这一句其实可以不加,但是会报出非空函数无返回值的警告......
}
int main(void)
{
// 测试代码
int arr[] = {1, 2, 3, 5, 8, 13, 21};
int n = sizeof(arr) / sizeof(arr[0]);
int target = 13;
int result = binarySearchRecursive(arr, 0, n - 1, target);
if (result == -1)
{
cout << "Target is not present in array" << endl;
}
else
{
cout << "Target is present at index: " << result << endl;
}
return 0;
}