C++搜索算法(一)、二分查找

1、定义

二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列
二分查找介绍-百度百科

2、原理

  • 二分查找算法的原理如下:
      1. 设置查找区间:low = 0;high= n;
      1. 若查找区间[low, high]不存在,则查找失败;否则转步骤3
      1. 取中间位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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值