一、使用条件:
1.有序排列 2.无重复元素
二、时间复杂度:O(logN)
三、关键:循环不变量原则——区间的定义就是不变量
四、两种写法
第一种(左闭右闭)
//使用二分查找的条件:1.有序;2.无重复元素
//库函数qsort排序
int cmp(const void* e1,const void* e2)
{
return (*(int*)e1-*(int*)e2);
}
int BinarySearch(int* nums,int numsSize,int target)
{
qsort(nums,numsSize,sizeof(int),cmp);
int left=0;
int right=numsSize-1;//注意:这里是right=numsSize-1
while (left<=right)//注意:这里是<=
{
int mid=left+(right-left)/2;//防止溢出
if (nums[mid]>target) right=mid-1;//注意:这里是right=mid-1
else if (nums[mid]<target) left=mid+1;
else return mid;
}
return -1;
}
第二种(左闭右开)
//使用二分查找的条件:1.有序;2.无重复元素
//排序
int cmp(const void* e1,const void*e2){
return (*(int*)e1-*(int*)e2);
}
int BinarySearch(int* nums,int numsSize,int target){
qsort(nums,numsSize,sizeof(int),cmp);
int left=0;
int right=numsSize;//注意:这里是right=numsSize
while (left<right){//注意:这里是left<right
int mid=left+(right-left)/2;
if (nums[mid]<target) left=mid+1;
else if (nums[mid]>target) right=mid;//注意;这里是right=mid
else return mid;
}
return -1;
}
五、相关题目
leetcode 704 二分查找