package junit.test;<br />/**<br /> * 二分法尋找,必須對已經排好序的序列進行尋找,假設現在有一個遞增序列,取中間位置的數及序號midIndex=(beginIndex+endIndex)/2,<br /> * 然後將一個序列折成兩半,beginIndex~midIndex,midIndex~endIndex,如果目標數T等於S[midIndex],找到,<br /> * 否則,如果T<S[midIndex],則在beginIndex~midIndex中繼續尋找;如果T>S[midIndex],則在midIndex~endIndex<br /> * 中繼續尋找,如此反覆進行,直到找到目標資料,<br /> * 初始對傳入參數進行約束及避免無效計算的條件為,T<S[beginIndex]或T>S[endIndex]或beginIndex>endIndex<br /> * 或beginIndex>S.length-1||endIndex>S.length-1||beginIndex<0||endIndex<0<br /> *<br /> */<br />public class BinarySearchTest {<br /> /**<br /> * 找到返回索引下標,否則返回-1;<br /> * @return index<br /> */<br /> public int binarySearch(int dataset[],int target,int beginIndex,int endIndex){<br /> //數組校正<br /> if(dataset==null||dataset.length==0){<br /> return -1;<br /> }<br /> //beginIndex,endIndex校正<br /> if(beginIndex>endIndex||beginIndex>dataset.length-1||endIndex>dataset.length-1||beginIndex<0||endIndex<0){<br /> System.out.println("error arguments!");<br /> return -1;<br /> }</p><p> //無效參數處理<br /> if(target<dataset[beginIndex]||target>dataset[endIndex]||beginIndex>endIndex){<br /> return -1;<br /> }<br /> int midIndex=(beginIndex+endIndex)/2;</p><p> //System.out.println(midIndex);<br /> if(target==dataset[midIndex]){<br /> return midIndex;<br /> }<br /> else if(target<dataset[midIndex]){<br /> return binarySearch(dataset,target,beginIndex,midIndex-1);//注意midIndex-1<br /> }<br /> else{<br /> return binarySearch(dataset,target,midIndex+1,endIndex);//注意midIndex+1<br /> }</p><p> }</p><p> /**<br /> * @param args<br /> */<br /> public static void main(String[] args) {<br /> // TODO Auto-generated method stub<br /> BinarySearchTest bs=new BinarySearchTest();</p><p> int[] data=new int[]{1,3,5,7,9,12};</p><p> int index=bs.binarySearch(data,12,0, 5);</p><p> System.out.println("The position of the target number in the array is :"+ index);<br /> }</p><p>}</p><p>