代码如下,其他的不多叙述,看注释即可
代码语言:javascript复制/**
* 二分查找两种写法
*/
package array;
import java.util.Arrays;
/**
*
* @author lizhongfeng_李忠峰
* @fileinfo Test array ArrayDemo.java
* @time 2015年9月12日
*/
public class ArrayDemo {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr = { 13, 15, 19, 28, 33, 45, 78, 106 };
System.out.println(halfSearch(arr, 33));
System.out.println(halfSearch2(arr, 33));
System.out.println(insert(arr, 5));
System.out.println(Arrays.binarySearch(arr, 33));// 使用java内置函数查找,不存在时返回的num= -插入位置-1
}
// 写法①
// 先判断中间值是不是key,如果不是再和中间值比较,循环知道找到或者循环结束;
public static int halfSearch(int[] arr, int key) {
int max, min, mid;
min = 0;
max = arr.length - 1;
mid = (max min) / 2; // 循环判断要用到,所以要先计算,方法②用不到,可以直接写在循环里面;
while (arr[mid] != key) {
if (key > arr[mid]) {
min = mid 1;
} else if (key < arr[mid]) {
max = mid - 1;
}
if (max < min) {
return -1;
}
mid = (min max) / 2;
}
return mid;
}
// 写法②
// 先判断小的角标是不是比大的角标大,如果大,说明已经循环结束了。
public static int halfSearch2(int[] arr, int key) {
int min, max, mid;
min = 0;
max = arr.length - 1;
while (min <= max) {
mid = (min max) / 2;
if (key > arr[mid]) {
min = mid 1;
} else if (key < arr[mid]) {
max = mid - 1;
} else {
return mid;
}
}
return -1;
}
// 插入一个值时,大小序时应该插入的位置
public static int insert(int[] arr, int key) {
int min, max, mid;
min = 0;
max = arr.length - 1;
while (min <= max) {
mid = (min max) / 2;
if (key > arr[mid]) {
min = mid 1;
} else if (key < arr[mid]) {
max = mid - 1;
} else {
return mid;
}
}
return min;
}
}