二分查找

来源:互联网 发布:核酸数据库 编辑:程序博客网 时间:2024/06/07 09:38

假设:递增数组,无相同元素

基本实现

在数组arr中查找元素target,若找到,则返回元素的位置,否则返回-1

int bSearch(vector<int> arr, int target) {    int low=0, high=arr.size()-1;    while(low<high) {        int mid=low+((high-low)>>1);        if(arr[mid]>target)            high=mid-1;        else if(arr[mid]<target)            low=mid+1;        else            return mid;    }    return -1;}

找边界值

在数组arr中找出第一个大于target的元素,若存在,返回其位置,否则,返回-1

int bSearchUpperBound(vector<int> arr, int target) {    int low=0, high=arr.size()-1;    if(low>high || target>=arr[high]) return -1;    int mid=low+((high-low)>>1);    while(high>low) {        if(arr[mid]>target)            high=mid;        else            low=mid+1;        mid=low+((high-low)>>1);    }    return mid;}

在数组arr中找出第一个小于target的元素,若存在,返回其位置,否则,返回-1

int bSearchLowerBound(vector<int> arr, int target) {    if(low>high || target<=arr[low]) return -1;    int mid=low+((high-low+1)>>1);    while(low<high) {        if(arr[mid]<target)            low=mid;        else            high=mid-1;        mid=low+((high-low+1)>>1);    }    return mid;}

在轮转后的有序数组上二分查找

int bSearchRotated(vector<int> arr, int target) {    int low=0, high=arr.size()-1;    while(low<high) {        int mid=low+((high-low)>>1);        if(target<arr[mid]) {            if(arr[mid]<arr[high])                high=mid-1;            else {                if(target<arr[low])                    low=mid+1;                else                    high=mid-1;            }        } else if(arr[mid]<target) {            if(arr[low]<arr[mid])                low=mid+1;            else {                if(arr[high]<target)                    high=mid-1;                else                    low=mid+1;            }        } else            return mid;    }    return -1;}

转自Ider

0 0
原创粉丝点击