上代码,注释里写了具体的含义
public static int binarySearchRN(Comparable[] arr, int n, Comparable target){
//int l = 0, r = n - 1;//在数组中从[l...r]的范围内寻找target
//循环不变量l 与 r 就代表了需要查找的这个范围的左右边界,而选择取不同的值,对于这个区间来说就是开区间与闭区间的区别,在修改它们的同时,也需要在循环中同步这一定义。这也就是循环不变量的意义
//int l = 0, r = n;
//int l = -1, r = n -1;
int l = -1, r = n;//在数组中从[l...r)的范围内寻找target
//while (l <= r ){ //当l == r时,区间[l...r]依然有效
while (l < r) {
int mid = (l + r ) / 2;//为了防止整型溢出的问题,可以修改为l + (r - l) / 2
if(arr[mid].compareTo(target) == 0) return mid;
if(target.compareTo(arr[mid]) > 0)
// l = mid + 1; // 在[mid + 1 ... r]中寻找目标
l = mid; // 在(mid ... r)中寻找目标
else
//r = mid - 1; //在[l ... mid - 1]中寻找目标
r = mid; //在(l ... mid)中寻找目标
}
return -1;
}
//测试
public static void main(String[] args) {
int n = 1000000;
Integer[] data = MyUtil.generateOrderArray(n);
long startTime = System.currentTimeMillis();
for (int i = 0; i < n; i ++)
if(i != BinarySearch.binarySearchRN(data, data.length, i))
throw new IllegalArgumentException("error");
long endTime = System.currentTimeMillis();
System.out.println("time cost: " + (endTime - startTime) + "ms");
}
明确每一个变量的含义,就能明确循环不变量