二分查找
二分查找(Binary Search)是一种在有序数组中查找特定元素的搜索算法。它的思想是不断将待查找区间分成两部分,并通过比较目标值与中间元素的大小关系来确定目标值可能存在的区间,从而缩小搜索范围,直到找到目标值或确定目标值不存在为止。
具体步骤如下:
- 确定搜索范围:首先确定整个数组的搜索范围,通常是设置两个指针,一个指向起始位置,另一个指向末尾位置。
- 计算中间位置:计算中间元素的索引位置。
- 比较中间元素:将目标值与中间元素进行比较。
- 缩小搜索范围:
(1)如果目标值等于中间元素,则找到目标值,结束搜索。
(2)如果目标值小于中间元素,说明目标值可能存在于左半部分,缩小搜索范围为左半部分。
(3)如果目标值大于中间元素,说明目标值可能存在于右半部分,缩小搜索范围为右半部分。
5. 重复以上步骤:在新的搜索范围内重复执行步骤2至步骤4,直到找到目标值或确定目标值不存在为止。
二分查找的时间复杂度为 O(log n),其中n是数组的大小。由于它每次都将搜索范围减半,因此效率非常高,特别适用于有序数组的查找操作。
// 基本的二分查找 适用于有序 无重复元素的数据
// 左闭右闭型
public static void main(String[] args) {
int a[]= {1,3,5,7,9,11,23,45,66};
System.out.println("1111");
int b = binarrySearch(11,a);
System.out.println(b);
}
public static int binarrySearch(int target,int[] a){
int i = 0, j = a.length-1;
while(i<=j){
int mid = (i+j) >>> 1;
if(target < a[mid]){
j = mid - 1;
}else if(target > a[mid]){
i = mid + 1;
}else{
return mid;
}
}
return -1;
}
// 左闭右开型
public static void main(String[] args) {
int[] b = {1,2,3,4,5,6,7};
int i = binarrySearch(5, b);
System.out.println(i);
}
public static int binarrySearch(int target,int[] a){
int i = 0, j = a.length;
while(i < j){
int mid = (i+j) >>> 1;
if(target < a[mid]){
j = mid ;
}else if(target > a[mid]){
i = mid + 1;
}else {
return mid;
}
}
return -1;
}
/*
* 二分查找平衡板 解决不平衡问题
* if(target < a[mid])
* else(target > a[mid])
* 若target 在最左边 if 里面需比较l次
* 那么在最右边 if 就要里面比较2l次
* */
public static int binarrySearch(int target,int[] a){
int i = 0,j = a.length;
while(1<j-i){
int mid = (i+j) >>> 1;
if(target < a[mid]){
j = mid;
}else{
i = mid;
}
}
if(a[i] == target){
return i;
}else{
return -1;
}
}