上动图:
基于有序数组不断二分递归查找
取中间的元素与想要查找的元素对比
如果相等返回中间的数,
如果小于中间的数就在左边查找
如果大于中间的数就在右边查找
public static <E extends Comparable<E>> int search(E[] data,int l,int r,E target){
if (l>r)return -1;//数组中没有元素
int mid = l+(r-l)/2;//取中间元素的索引 0+(8-0)/2 防止溢出
//目标数==中间数
if (data[mid].compareTo(target)==0){
return mid;//找到了返回索引
}else if (data[mid].compareTo(target)<0){//目标数>中间数 右边查找
return search(data,mid+1,r,target);
}else{
return search(data,l,mid-1,target);//目标数<中间数 左边查找
}
}
//非递归方法实现二分查找法
public static <E extends Comparable<E>> int searchN(E[] data,int l,int r,E target){
//循环不变量:在data[l...r]里面查找target
while(l<=r){
int mid = l+(r-l)/2;//不断地取中间索引
//目标数==中间数
if (data[mid].compareTo(target)==0){
return mid;//找到了返回索引
}else if (data[mid].compareTo(target)<0){//目标数>中间数 右边查找
l=mid+1;//变换查找范围到右边区域
}else{
r=mid-1;变换查找范围到左边区域 目标数<中间数 左边查找
}
}
return -1;
}
public static void main(String[] argc){
Integer[] data={1,2,3,4,5,6,7,8,9};
int index=searchN(data,0,data.length-1,9);
System.out.print(" "+index);
}
心中无女人,手速自然快。