二分查找及其举一反三的使用。

  1. 典型的二分查找算法,通过对mid不断的判断来确定最终的key值得位置。代码如下:

  2. int getnumber(int intarr[], int length, int key)
    {
    int num = 0;
    int start = 0;
    int end = length - 1;
    while (start <= end)//这里必须是<=,很重要的一点,二分查找的重点
    {
    int mid = (start + end) / 2;
    if (intarr[mid] == key)
    {
    return mid;
    }
    if (intarr[mid] > key)
    {
    end = mid - 1;
    }
    if (intarr[mid] < key)
    {
    start = mid + 1;
    }
    }
    return -1;
    }
    变种1、查找第一个与key相等的元素。代码如下:由于是第一个等于key的元素,那么我们可以确定最后的位置在start位置。判断start位置即可。
    int firstSameKey(int intarr[], int length, int key)
    {
    int num = 0;
    int start = 0;
    int end = length - 1;
    while (start <= end)
    {
    int mid = (start + end) / 2;
    if (intarr[mid] >= key)
    {
    end = mid - 1;
    }
    if (intarr[mid] < key)
    {
    start = mid + 1;
    }
    }
    if (start >= 0 && intarr[start] == key)
    {
    return start;
    }
    return -1;
    }
    变种2、查找最后一个等于key的元素,由于是最后一个等于key的元素,那么我们可以确定最后的位置在end位置。判断end位置即可。
    int lastSameKey(int intarr[], int length, int key)
    {
    int num = 0;
    int start = 0;
    int end = length - 1;
    while (start <= end)
    {
    int mid = (start + end) / 2;
    if (intarr[mid] <= key)
    {
    start = mid + 1;

    }
    if (intarr[mid] > key)
    {
    	end = mid - 1;
    }
    

    }
    if (end <= length-1 && intarr[end] == key)
    {
    return end;
    }
    return -1;
    }
    变种三,最后一个小于等于key的元素,代码如下:
    int lastSameLessKey(int intarr[], int length, int key)
    {
    int num = 0;
    int start = 0;
    int end = length - 1;
    while (start <= end)
    {
    int mid = (start + end) / 2;
    if (intarr[mid] <= key)
    {
    start = mid + 1;

    }
    if (intarr[mid] > key)
    {
    	end = mid - 1;
    }
    

    }
    return end;
    }
    二分查找的变种还有第一个大于等于key的元素,第一个大于等于key的元素,第一个小于key的元素的等等,我们可以根据要求先判断需要返回的是end还是start,然后尽可能的吧符合要求的元素落到start或者end上面。
    比如第一个大于等于key的元素,返回的是start,
    int firstSameBigKey(int intarr[], int length, int key)
    {
    int num = 0;
    int start = 0;
    int end = length - 1;
    while (start <= end)
    {
    int mid = (start + end) / 2;
    if (intarr[mid] < key)//由于我们最后的是大于等于,当mid值<key的时候,需要处理star,那么必须处理start。
    {
    start = mid + 1;

    }
    if (intarr[mid] >= key)//由于我们最后的是start,当mid值>=key的时候,处理end。
    {
    	end = mid - 1;
    }
    

    }
    return start;
    }
    查找最后一个小于key的元素,最后一个肯定是end啦。
    int lastLessKey(int intarr[], int length, int key)
    {
    int num = 0;
    int start = 0;
    int end = length - 1;
    while (start <= end)
    {
    int mid = (start + end) / 2;
    if (intarr[mid] < key)
    {
    start = mid + 1;

    }
    if (intarr[mid] >= key)
    {
    	end = mid - 1;
    }
    

    }
    return end;
    }
    二分查找这点是关键:while (start <= end),切记切记啊。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值