# 二分查找算法(非递归)
# 介绍
前面讲过 二分查找算法(递归),这里使用非递归形式实现。
二分查找法只适用于从 有序 的数列中查找(比如数字和字母等),将数列 **排序后 **再进行查找。
二分查找法的运行时间为对数时间 O(log2n) ,即查找到目标位置最多只需要 log2n 步,假设从 0~99
的队列(100 个数,即 n = 100),中旬到目标数 30,则需要查找的步数为 log2100,即最多需要查找 7 次(26 < 100 < 27,100 介于 2 的 6、7 次方之间,次方则是寻找的步数)
# 代码实现
package cn.mrcode.study.dsalgtutorialdemo.algorithm.binarysearchnorecursion;
import org.junit.Test;
/**
* 二分查找:非递归
*/
public class BinarySearchNoRecur {
@Test
public void fun() {
int[] arr = new int[]{1, 3, 8, 10, 11, 67, 100};
int target = 1;
int result = binarySearch(arr, target);
System.out.printf("查找 %d ,找位置为 %d \n", target, result);
target = 11;
result = binarySearch(arr, target);
System.out.printf("查找 %d ,找位置为 %d \n", target, result);
target = 100;
result = binarySearch(arr, target);
System.out.printf("查找 %d ,找位置为 %d \n", target, result);
target = -1;
result = binarySearch(arr, target);
System.out.printf("查找 %d ,找位置为 %d \n", target, result);
target = 200;
result = binarySearch(arr, target);
System.out.printf("查找 %d ,找位置为 %d \n", target, result);
}
/**
* 二分查找:非递归
*
* @param arr 数组,前提:升序排列
* @return 找到则返回下标,找不到则返回 -1
*/
public int binarySearch(int[] arr, int target) {
int left = 0;
int right = arr.length;
int mid = 0;
// 表示还可以进行查找
while (left <= right) {
mid = (left + right) / 2;
if (mid >= arr.length // 查找的值大于数组中的最大值
) {
// 防止越界
return -1;
}
if (arr[mid] == target) {
return mid;
}
// 升序:目标值比中间值大,则向左查找
if (target > arr[mid]) {
left = mid + 1;
} else {
// 否则:向右查找
right = mid - 1;
}
}
return -1;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
测试输出
查找 1 ,找位置为 0
查找 11 ,找位置为 4
查找 100 ,找位置为 6
查找 -1 ,找位置为 -1
查找 200 ,找位置为 -1
1
2
3
4
5
2
3
4
5