浅谈二分查找

来源:互联网 发布:软件合同书 编辑:程序博客网 时间:2024/06/10 15:07

参考文章点击这里

1.二分查找值为key的下标,如果不存在返回-1

int binsearch(int a[],int len,int val){    int first=0,last=len-1,mid=0;    while (first<=last){        mid=first+(last-first)>>1;        if(a[mid]==val){            return mid;        } else if (a[mid]>val){            last=mid-1;        } else{            first=mid+1;        }    }    return -1;}

int binsearch(int a[],int len,int val){    int first=0,last=len-1,mid=0;    while (first<last){        mid=first+(last-first)>>1;        if(a[mid]==val){            return mid;        } else if (a[mid]>val){            last=mid;        } else{            first=mid+1;        }    }    if(a[first]==val){        return first;    }    return -1;}

我们仔细观察这段代码知道我们在last=mid-1的地方改为last=mid;跳出循环的时候first==last,这个时候我们需要在跳出循环的时候检查是否满足题意即可。


int binsearch(int a[],int len,int val){    int first=0,last=len-1,mid=0;    while (first<last-1){        mid=first+((last-first)>>1);        if(a[mid]==val){            return mid;        } else if (a[mid]>val){            last=mid-1; //last=mid; 这两种情况都是可以的        } else{            first=mid;        }    }    if (last>=0&&a[last]==val){        return last;    } else if (a[first]==val){        return first;    }    return -1;}

我们在来仔细观察这段代码,我们把first得值变为mid这样做的后果会导致数组为2的时候发生死循环
[1,2] 目标为2,开始的时候first=0,last=1, mid=0,这时候会发生死循环,我们只要控制数组的长度为2的时候跳出循环,然后检查rigth的值,再检查left的值,可以自己体会为什么.


通过对上面的研究,我们发现right==mid or right==mid-1,其实对于while(……)中的内容是没有变化的,如果right==mid,一定不会有left>right如果right==mid-1,则条跳出循环后可能会出现left>rigth

还有一个重要的结论就是容易产生死循环的地方是left==mid,这种情况有两种,分别为数组长度为1,2。left=mid(对应数组长度为2),left==mid+1(对应数组长度为1)


0 0
原创粉丝点击