二分查找
例子引入
A:你的鞋多少钱买的?
B:你猜
A:1000?
B:不对,说高了
A:500?
B:高了
A:250?
B:低了
…
如此反复,一次排除一半,最终肯定可以得到正确的值
二分查找
优点:比较次数少,查找速度快,平均性能好。
缺点:查找的数组必须为排序好的数组。
时间复杂度:O(logN)
#include<stdio.h>
int binary_search(int key,int a[],int n)
{
int high,mid,low,count;
low=0;
high=n-1;
count=0;
while(low<=high){
mid=(high+low)/2;
if(a[mid]==key){
printf("查找成功,a[%d]=%d",mid,key);
count=1;
break;
}
else if(a[mid]<key)
low=mid+1;
else
high=mid-1;
}
if(count==0)
printf("查找失败");
return 0;
}
int main(){
int i,n,a[100],key;
printf("请输入数组长度:\n");
scanf("%d",&n);
printf("请输入数组元素:\n");
for(i=0;i<n;i++)
scanf("%d",&a[i]);
printf("输入你要查找的元素:\n");
scanf("%d",&key);
binary_search(key,a,n);
return 0;
}
java代码
class Solution {
public int search(int[] nums, int target) {
int low = 0;
int high = nums.length-1;
while(low<=high){
// int mid = (low+high)/2;
int mid = (high-low)/2+low;
if(nums[mid]==target){
return mid;
}else if(nums[mid]>target){
high=mid-1;
}else{
low = mid+1;
}
}
return -1;
}
}
分析二分查找的一个技巧是:不要出现 else,而是把所有情况用 else if 写清楚,这样可以清楚地展现所有细节。
仅适用于有序的顺序表(即要把所有的数据都存放在数组中)
大致思想:即把数据分为两部分,前一部分是较小的部分,后一部分是较大的部分;
如果要找的数比较小,那我们就先找前一部分,如果要找的数据比较大,那我们就先找后一部分;
算法思想:
首先将给定值key与表中中间位置元素的关键字比较,
若相等,则返回该元素的位置;
若不等,则在前半部分或者后半部分进行查找。
对于链式表,如果想要找到中间位置,那么就要遍历全部元素,
对于数组,只需要表长除以2即可
查找序列升序时,若key小于中间元素,则查找前半部分,
若key大于中间元素,则查找后半部分。
重复该过程,直到找到查找的元素为止,或者查找失败。
代码的那个一定要写小于等于号,要不然就要对代码内容作出改变
如果要查找的元素是偶数个,那么找中间值会出现一个。5,我们要取下界
平均查找效率ASL:
折半查找的时间复杂度为O(logn)