➢ 二分查找思路分析:
- 首先确定该数组的中间的下标 mid= (left +right) / 2
- 然后让需要查找的数 findVal 和 arr[mid] 比较
2.1 findVal > arr [mid] ,说明你要查找的数在mid的右边,因此需要递归的向右查找
2.2 findVal < arr [mid],说明你要查找的数在mid的左边,因此需要递归的向左查找
2.3 findVal == arr [mid]说明找到,就返回
二分查找的前提是数组时有序的。
二分查找算法(递归)实现
➢ 代码实现:
使用递归思维:查找其中的一个元素,返回值设为int类型:
public static int Dichotomy(int[] arr, int left, int right, int value) {
int middle = (left + right) / 2;
int middlevalue = arr[middle];
// 当left>right表示没有找到
if (left > right) {
return -1;
}
if (value > middlevalue) {
return Dichotomy(arr, middle + 1, right, value);
} else if (value < middlevalue) {
return Dichotomy(arr, left, middle - 1, value);
} else {
return middle;
}
}
在main函数当中进行测试
int[] arr = { 1, 5, 78, 100,100,546, 584, };
int resIndex = Dichotomy(arr, 0, arr.length - 1, 546);
System.out.println(resIndex);
当数组当中又多个相同的数据的时候,都要获取出来,这个时候就需要使用到ArrayList数组集合。实现代码如下
public static ArrayList<Integer> Dichotomy1(int[] arr, int left, int right, int value) {
int middle = (left + right) / 2;
int middlevalue = arr[middle];
if (left > right) {
return new ArrayList<Integer>();
}
if (value > middlevalue) {
return Dichotomy1(arr, middle + 1, right, value);
} else if (value < middlevalue) {
return Dichotomy1(arr, left, middle - 1, value);
} else {
ArrayList<Integer> List = new ArrayList<Integer>();
int temp = middle - 1;
while (true) {
if (temp < 0 || arr[temp] != value) { // 没有找到
break;
}
List.add(temp);
temp--;
}
List.add(middle);
temp = middle + 1;
while (true) {
if (temp > arr.length - 1 || arr[temp] != value) { // 没有找到
break;
}
List.add(temp);
temp ++;
}
return List;
}
}
同理:调用方法进行测试:
二分查找算法(非递归)介绍
二分查找法的运行时间为对数时间0(log2n),即查找到需要的目标位置最多只需要log2 n步,假设从[0,99]的队列(100个数,即n=100)中 寻到目标数30,则需要查找步数为lbg2100 ,即最多需要查找7次(2^6 < 100 <2^7).
代码实现:
public class DichotomySearch {
public static int search(int[] arr, int value) {
int left = 0;
int right = arr.length - 1;
while (left <= right) {
int middle = (left + right) / 2;
if (arr[middle] == value) {
return middle;
} else if (arr[middle] > value) {
right = middle - 1;
}else {
left=middle+1;
}
}
return -1;
}
public static void main(String[] args) {
int [] arr= {1,5,9,45,85,96};
int index=search(arr, 9);
System.out.println("index = "+index);
}
}