浅谈二分查找法

要求:在一个有序的数组中,查找是否有对应的元素。
思想:每次将中间元素与对应的数进行比较,进行判断,若相等跳出循环,若查找完毕无对应元素,返回-1值。提到二分,我们就会立即想到就会存在精度问题。

*关键点:
1.每次用中间元素mid对应的值进行比较,那么,我们必须保证mid可以访问到每一个元素。
举例:若left=3;right=4;mid=3;若此时设计的程序没有mid给left,right进行赋值进行+1或-1修正,则mid永远访问不到最后一个元素。

2.二分我们也可以保证精度不损失,只要我们能够知道l类似(3+4)/2=3二分之后朝较小的值取。所以说:给right用mid进行复制时,可以为right=mid,也可以right=mid-1;因为如果mid对应的值小于data,left=mid+1,(left永远小于right,否则就会跳出循环,也就是说mid只会可能给left大,不会比left小,极端情况下就是left=right=mid)会进行修正。二分之后的mid照样可以访问到最后一个元素。

#include<stdio.h>
#include<windows.h>

int BinarySearch(int array[], int n, int v);


int main()
{
    int arr[] = { 1, 2, 3, 4,5,6};

    printf("%d\n", BinarySearch(arr, sizeof(arr) / sizeof(arr[0]),3));

    getchar();

    return 0;
}



int BinarySearch(int array[], int n, int v)
{
    int left, right, middle;

    left = 0, right = n;

    while (left <= right)   //循环条件必须可以满足left<=right
    {
        middle = (left + right) / 2;
        if (array[middle] > v)
        {
            right = middle;
        }
        else if (array[middle] < v)
        {
            left = middle+1;
        }
        else
        {
            return middle;
        }
    }

    return -1;
}

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值