算法学习笔记1:
1:二分查找
int[] arr=new int[]{1,2,3,5,1,6,7,9,10,11,12,14,18,15};
binatSearch(arr, 12);
}
public static int binatSearch(int[] arr,int a){
int low=0;
int height=arr.length-1;
int mid=low/height;
while(low<=height){
mid=(low+height)/2;
if(arr[mid]<a){
low=mid+1;
}
else if(arr[mid]>a) {
height=mid-1;
}
else {
return mid;
}
}
return -1;
}
使用要求: 1 有序 实现思路:1:确定最坏情况没找到(low<=height) 2:二分查找 基于最低最高位取其中间 所以 a[每次的取值(low+height)/2], 3:找值 由于要求条件1制约 我们取的值只可能比我们的大或者小,大 表示我们要找的值在我们的左边。所以heigh=middle
为什么-1 因为数组角标 0--n-1 4:如果我们取出的a[(midle+height)/2] <我们查找的,表示我们要查找的数据在我们的右边。,所以low=midle+1; 最终循环每次middle=(low+height)/2 ; 与我们传入的值比较 相同返回角标,与顺序查找(冒泡,快速排序) 效率大大提高。
2:健壮性二分查找
public static void main(String[] args) {
}
public static int binarySearch(int[] arr,int a){
int mid=0;
if(arr.length==0){
return -1;
}
int low=0;
int heigh=arr.length-1;
while(low<=heigh){
mid=(low+heigh)/2;
if(arr[mid]<a){
low=mid+1;
}else{
heigh=mid;
}
}
if(arr[low]==a){
return low;
}
return -1;
}
健壮性: 在该算法中在查找我们想要的元素时,如果不比mid的项大,那么他在包含Mid的位置范围内,在我们跳出循环的时,子范围看就是1!!!,可以测试是否有匹配。
3:
浙公网安备 33010602011771号