二分查找法过程详解

    xiaoxiao2021-04-12  48

    首先第一要素需要明白,二分查找法适用于有序数组,记住,二分查找之前一定要排序!!!

    二分查找元素

    代码:

    int base=0; int top=size-1; while(base<=top){ mid=(top+base)/2; if(v[mid]==target) break; //mid为所求下标 if(v[mid]<target) base=mid+1; if(v[mid]>target) top=mid-1; }

    二分查找过程: 我们可以把整个查找过程看成是不停地聚拢top和base,执行下面两种操作

    if(v[mid]<target) base=mid+1; if(v[mid]>target) top=mid-1;

    直到两者重合,然后越位退出循环,如果这个过程中出现了下面两个终止条件则提前结束:

    v[mid]==target,即出现了查找目标,停止查找,返回mid为查到的目标下标. 最不理想的情况是直到最后top与base都会指向同一个元素target才返回.如果数组中不存在targret,那么在最后一次循环体里面应该是这样的情形:top与base同时指向第一个大于target的元素,由于其大于target, 执行top=mid-1,那么结果就是base指向大于target的第一个数,top指向小3于target的最后一个数,然后退出循环.

    利用二分查找定界

    即给定一个有序数组,找到元素i,使得i之前的元素(包括i)都不大于target,i之后的元素都大于target. 可以分两种情况来考虑

    1.数组中不存在target. 则根据第一部分的讨论,最后top和base同时指向第一个大于target的元素,然后进行最后一次小标变换,top=mid-1前移一个元素指向最后一个小于target的元素,base指向第一个大于target的元素.则top为所求

    while(base<=top){ mid=(top+base)/2; if(v[mid]<target) base=mid+1; if(v[mid]>target) top=mid-1; }

    2.数组中存在target.我们只要把等于target的元素和小于target的元素归为一类,则最后结果仍然为top与base指向第一个大于target的元素,然后进行最后一次下标变换,top=mid-1前移一个元素,指向的是最后一个等于target的元素,base指向第一个大于target的元素.

    while(base<=top){ mid=(top+base)/2; if(v[mid]<=target) base=mid+1; if(v[mid]>target) top=mid-1; }

    综合上面两种情况,最后的代码为

    while(base<=top){ mid=(top+base)/2; if(v[mid]<=target) base=mid+1; if(v[mid]>target) top=mid-1; }
    转载请注明原文地址: https://ju.6miu.com/read-667510.html

    最新回复(0)