2种二分查找及2种优化方式

题目1:经典算法—二分查找
折半查找的基本思想:减小查找序列的长度,分而治之的进行关键字的查找。该序列必须是有序的
查找过程是:在有序表中,取中间的记录作为比较关键字,若给定值与中间记录的关键字相等,则查找成功;若给定的值小于中间记录的关键字,则在中间记录的左半区间继续查找;若给定值大于中间记录的关键字,则在中间记录的右半区间继续查找;不断重复这个过程,直到查找成功。否则查找失败

实现:通常设置3个指针:low、high、mid。假设序列(数组)是从小到大排序。如果数组是从大到小排序,只需要改一些代码即可,思想不变。

Code:

int BinSearch(int* array, int n, int key)
{
    int low = 0, high = n-1, mid;

    while (low <= high)
    {
        mid = (low + high) / 2;
        if (array[mid] == key)
        {
            return mid;
        }
        else if (key > array[mid])
        {
            low = mid +1;
        }
        else
        {
            high = mid - 1;
        }
    }

    return -1;
}

实际上,二分查找的过程可以绘制成一棵二叉树,每次二分查找的过程就相当于把原来的树划分为两棵子树,所以每次二分之后下次就只需要查找其中一半的数据就可以了。那么二分查找算法的时间复杂度是多少呢?在最好的情况下,只需要查找一次就可以了,因为这时候中间记录的关键字与要查找的key是相等,自然一次就够了。在最坏的情况下是从根节点查找到最下面的叶子结点,这个过程需要的时间复杂度是O(logn)

需要注意的是,虽然二分查找算法的效率很高(这也是二分查找算法被广泛应用的原因),但是仍然是有使用条件的:有序。就

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值