二分查找[折半查找]算法
1、思路分析
首先确定该数组的中间的下标
mid = (left + right) / 2
然后让需要查找的数 findVal 和 arr[mid] 比较
1 findVal > arr[mid] 说明要查找的数在mid的右边,因此需要递归的向右查找
2 findVal < arr[mid] 说明要查找的数在mid的左边,因此需要递归的向左查找
3 findVal == arr[mid] 说明找到,返回下标值
// 什么时候需要结束递归?
找到就结束递归递归完整个数组,仍然没有找到 findVal,也需要结束递归。当 left > right 就需要退出
2、代码示例
public class BinarySearch {
public static void main(String
[] args
) {
int[] arr
= {1,8,10,89,1000,1234};
int arrIndex
= binarySearch(arr
, 0, arr
.length
- 1, 1000);
System
.out
.println("所要查找的值的数组下标为:" + arrIndex
);
}
public static int binarySearch(int[] arr
, int left
, int right
, int findVal
) {
if (left
> right
) {
return -1;
}
int mid
= (left
+ right
) / 2;
int midVal
= arr
[mid
];
if (findVal
< midVal
) {
return binarySearch(arr
, left
, mid
- 1, findVal
);
} else if (findVal
> midVal
) {
return binarySearch(arr
, mid
+ 1, right
, findVal
);
} else {
return mid
;
}
}
}
3、程序执行结果
所要查找的值的数组下标为:4
课后思考题:
课后思考题: {1, 8, 10, 89, 1000, 1000, 1000, 1234} 当一个有序数组中, 有多个相同的数值时,如何将所有的数值都查找到,比如这里的 1000
1、思路分析
在找到mid 索引值,不要马上返回向mid 索引值的左边扫描,将所有满足 1000, 的元素的下标,加入到集合ArrayList向mid 索引值的右边扫描,将所有满足 1000, 的元素的下标,加入到集合ArrayList将ArrayList返回
2、代码示例
public static void main(String
[] args
) {
int[] arr2
= {1, 8, 1000, 89, 1000, 1000, 1000, 1234};
List
<Integer> list
= binarySearch2(arr2
, 0, arr2
.length
- 1, 1000);
System
.out
.println("所要查找的值的数组下标为:" + list
.toString());
}
public static List
<Integer> binarySearch2(int[] arr
, int left
, int right
, int findVal
) {
if (left
> right
) {
return new ArrayList<Integer>();
}
int mid
= (left
+ right
) / 2;
int midVal
= arr
[mid
];
if (findVal
> midVal
) {
return binarySearch2(arr
, mid
+ 1, right
, findVal
);
} else if (findVal
< midVal
) {
return binarySearch2(arr
, left
, mid
- 1, findVal
);
} else {
List
<Integer> resIndexList
= new ArrayList<Integer>();
int temp
= mid
- 1;
for (int i
= 0; i
<= temp
; i
++){
if (findVal
== arr
[i
]) {
resIndexList
.add(i
);
}
}
resIndexList
.add(mid
);
temp
= mid
+ 1;
for (int i
= temp
; i
< arr
.length
- 1; i
++) {
if (findVal
== arr
[i
]) {
resIndexList
.add(i
);
}
}
return resIndexList
;
}
}
3、程序执行结果
所要查找的值的数组下标为:[4, 5, 6]