Basic
需求:在有序数组A内,查找target
-
如果找到返回索引
-
如果找不到返回-1
算法描述 | |
---|---|
前提 | 给定一个内含n个元素的有序数组A,满足A0<=A1<=A2<=...<=An-1,一个待查值target |
1 | 设置i=0,j=n-1 |
2 | 如果i>j,结束查找,没找到 |
3 | 设置m = floor((i+j)/2),m为中间索引,floor是向下取整(<=(i+j)/2的最小整数) |
4 | 如果target < Am设置j=m-1,跳到第2步 |
5 | 如果Am < target设置i=m+1,跳到第2步 |
6 | 如果Am = target,结束查找,找到了 |
代码实现
package com.liulw.algorithms.binarysearch;
public class BinarySearch {
/**
* 二分查找基础版
* <p>
* Params:a->待查找的升序数组
* target->待查找的目标值
* <p>
* Returns:
* 找到则返回索引
* 找不到返回-1
*/
public static int binarySearchBasic(int[] a, int target) {
int i = 0, j = a.length - 1; //设置指针和初值
while (i <= j) { //范围内有东西
int m = (i + j) / 2;
if (target < a[m]) { //目标在左边
j = m - 1;
} else if (a[m] < target) { //目标在右边
i = m + 1;
} else { //找到了
return m;
}
}
return -1;
}
}
运行结果
package com.liulw.algorithms.binarysearch;
public class TestBinarySearchBasic {
public static void main(String[] args) {
int[] a = {7, 11, 13, 15, 24, 26, 27, 45};
int r1 = BinarySearch.binarySearchBasic(a,7);
int r2 = BinarySearch.binarySearchBasic(a,13);
int r3 = BinarySearch.binarySearchBasic(a,24);
int r4 = BinarySearch.binarySearchBasic(a,30);
System.out.println("r1:"+r1+"\nr2:"+r2+"\nr3:"+r3+"\nr4:"+r4);
}
}
r1:0
r2:2
r3:4
r4:-1