第一次用1比较
第二次区间为[1,N],取中点测试 ,根据hotter与colder更新下一次搜索区间下限或者上限
import edu.princeton.cs.algs4.StdOut;
public class E1_4_34 {
public static void main(String[]args){
int a=findKey(4,4);
}
public static int findKey(int N,int key){
//在[1,N]里寻找key
//第一次用1
int prevNum=1;
int prevDiff=Math.abs(1-key);
StdOut.printf("num=%5d diff=%5d\n", prevNum, prevDiff);
if (prevDiff==0) return prevNum;
int lo=1,hi=N;
//每次验证区间中点
int nowNum=(lo+hi)/2;
while (nowNum!=key){
int nowDiff=Math.abs(nowNum-key);
if (nowDiff<prevDiff) {
if (nowNum > prevNum)
lo = (prevNum + nowNum) / 2;
else //<
hi = (prevNum + nowNum) / 2;
StdOut.printf("num=%5d hotter diff=%5d lo=%5d hi=%5d\n", nowNum, nowDiff,lo,hi);
}
else if (nowDiff>prevDiff) {
if (nowNum > prevNum)
hi = (prevNum + nowNum) / 2;
else //<
lo = (prevNum + nowNum) / 2;
StdOut.printf("num=%5d colder diff=%5d lo=%5d hi=%5d\n", nowNum, nowDiff,lo,hi);
}
else{//diff相等
}
prevDiff=nowDiff;
if ((lo+hi)/2==prevNum)hi+=2;//int类型取整有可能nownum与prevnum相等,避免该情况发生
prevNum=nowNum;
nowNum=(lo+hi)/2;
}
StdOut.println("key="+nowNum);
return nowNum;
}
}