下面是折半查找的实现,data是按升序排列的数据,x是查找下标,y是查找的上标, v是查找的数值,返回v在data的索引,若没找到返回-1。代码不正确是____。 public int bsearch(int[] data, int x, int y, int v) { int m; while(x<y){ //1 m = x + (y-x)/2; //2 if(data[m] == v) return m; //3 else if(data[m] > v) y = m; //4 else x = m; //5 } return -1; //6 } 正确的方法: 上下标没有写清楚,题目所指的应该是[x,y),这样5应该是m-1 而在下标为[x,y]的情况下,1,4,5都是有问题的。。。。正确版本应该是这样吧 while(x<=y) { m = x + (y-x)/2; //2 if(data[m] == v) return m; //3 else if(data[m] > v) y = m-1; //4 else x = m+1; //5 } 补充:这里下标是个坑,记住上限有没有包含就可以对付1,4,5处的问题(熟记理解两个版本的代码区别),然后是2,写成x+(y-x)/2是防止xy都很大的情况下x+y越界。这样的话应对二分查找应该够了 |
|
来自: 雪柳花明 > 《C 笔试 理论基础题 准备》