1、定义
二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。
二分查找介绍-百度百科
2、原理
- 二分查找算法的原理如下:
-
- 设置查找区间:low = 0;high= n;
-
- 若查找区间[low, high]不存在,则查找失败;否则转步骤3
-
- 取中间位mid = (low + high) / 2;比较 target 与 arr[mid],有以下三种情况:
- 3.1 若 target < arr[mid],则high = mid - 1;查找在左半区间进行,转步骤2;
- 3.2 若 target > arr[mid],则low = mid + 1;查找在右半区间进行,转步骤2;
- 3.3 若 target = arr[mid],则查找成功,返回 mid 值;
-
3、代码实现
#include <iostream>
#include <vector>
using namespace std;
/**
* @namespace search
* @brief 搜索算法
*/
namespace search
{
/**
* @namespace binary_search
* @brief 二分查找算法
*/
namespace binary_search
{
/**
*@brief 实现二进制搜索的主函数
*@param arr要搜索的向量
*@param 要搜索的val值
*@return 向量arr中val的索引
*/
int binarySearch(std::vector<int> m_pArr, int m_pVal)
{
int low = 0; // 设置起点
int high = m_pArr.size() - 1; // 设置终点
while (low <= high)
{
int m = low + (high - low) / 2; // 设置中间点
if (m_pVal == m_pArr[m]) // 找到节点
return m;
else if (m_pVal < m_pArr[m]) // 节点在区间[arr[low], arr[m]]之间
high = m - 1;
else // 节点在区间[arr[m], arr[high]]之间
low = m + 1;
}
return -1; // 没找到,返回-1
}
void test_binarySearch()
{
std::vector<int> arr = { {1, 3, 5, 7, 9, 8, 6, 4, 2} };
std::sort(arr.begin(), arr.end());
int nSearch = binarySearch(arr, 4);
std::cout << "元素4位于动态数组中的第[" << nSearch << "]位" << std::endl; // 3
}
} // namespace binary_search
}// namespace search
int main()
{
search::binary_search::test_binarySearch();
return 0;
}