二分查找法

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

使用此查找法前提:
    1. 查找的存储结构必须为顺序存储结构,即按顺序依次存储元素的结构
    2. 该线性表中的元素必须为“已排序”。

二分查找法的时间复杂度:
    1. 二分查找法的基本思想就是不断比较表最中间的值,然后将表的范围分半去搜索,所以时间复杂度就是while循环的次数!!
    2. 总共为n个元素,渐渐跟下去就是n, n/2, n/4,....n/(2的k次方), 其中k是循环的次数。由于n/(2的k次方)取整后要>=1,即搜索到最后的字表最多为1个元素,所以,
令n/(2的k次方) = 1,可得"k = log2n",所以时间复杂度可以表示为O(log2n)。 
    3. 根据1、2可得,二分查找法时间复杂度最快为O(1), 最慢为O(log2n)。

查找过程(假设表中的元素是按升序排列的):
    1. 首先选取表中间的元素a[n/2]与需要查询的值x进行比较,如果量值相等,表明已找到,退出搜索
    2. 若没有找到,将表按照n/2的前半部和后半部分为两个子表a1、a2,同时比较x是大于a[n/2]还是小于a[n/2]
    3. 若x小于a[n/2],则表a1作为下一轮排序表;若x大于a[n/2],则表a2作为下一轮排序表
    4. 重复1、2、3,直到找到元素或者字表不存在为止。

代码如下:
/*
Desc: 折半查找法(Binary Search)
Param: array 查询的线性表
Param: searchValue 需要查询的值
Param:size 线性表array的长度
return: 返回值为查找到的元素在数组中的下标,如果没有没有找到,返回-1
*/
template
int BinarySearch(T array[], T searchValue, int size)
{
if ((array == NULL) || (size <= 0))
{
return -1;
}

int high = size - 1; //查询的终止位置
int low = 0;    //查询的起始位置
int middle = low + (high - low) / 2; //查询的子表中的中间值的位置

while ((high - low) >= 0)
{
    //刚好要找的值为字表中的中间值
    if (array[middle] == searchValue)
    {
        return middle;
    }

    //若不为子表中的中间值,则判断为哪一字表
    if (searchValue < array[middle])
    {
        high = middle - 1;
        middle = low + (high - low) / 2;
    }
    else
    {
        low = middle + 1;
        middle = low + (high - low) / 2;
    }
}

return -1;

}

运行结果:
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值