|
下面是折半查找的實現(xiàn),data是按升序排列的數(shù)據(jù),x是查找下標,y是查找的上標, v是查找的數(shù)值,返回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 } 正確的方法: 上下標沒有寫清楚,題目所指的應(yīng)該是[x,y),這樣5應(yīng)該是m-1 而在下標為[x,y]的情況下,1,4,5都是有問題的。。。。正確版本應(yīng)該是這樣吧 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處的問題(熟記理解兩個版本的代碼區(qū)別),然后是2,寫成x+(y-x)/2是防止xy都很大的情況下x+y越界。這樣的話應(yīng)對二分查找應(yīng)該夠了 |
|
|