如果懂了快速排序的話呀忧,對于理解二分查找就會更容易。同樣也是左右指向不斷的移動咏闪。先折半,然后左指向往后移動,右指向往前移备图,但是二分查找的前提必須是有序數組。下面演示代碼:
//二分查找赶袄,前提是必需是有序數組
public class BinaryFind {
public static void main(String[] args) {
int[] arr = {1,32,654,874,3768,32132,32132,32132,32133};
List<Integer> list = binaryFind(arr, 0, arr.length-1, 32132);
System.out.println(list);
}
public static List<Integer> binaryFind(int[] arr,int left,int right,int findVal){
if(left>right || findVal<arr[0] || findVal>arr[arr.length-1]) {
return new ArrayList<Integer>();
}
System.out.println("1");
int mid = (left+right)/2;//取中間值的下表
int midVal = arr[mid];//取中間值
if(findVal<midVal) {
return binaryFind(arr,left,mid-1,findVal);//沒找到繼續(xù)左遞歸查找
}else if(findVal>midVal) {
return binaryFind(arr,mid+1,right,findVal);//沒找到繼續(xù)右遞歸查找
}else {
//此處創(chuàng)建集合是因為有可能數組中存在相同的數多次揽涮,所以都找出來,把他們的下標存在集合中
List<Integer> list = new ArrayList<Integer>();
//當查找的數在數組中存在時,mid就是已經找到的第一個下標饿肺,接著左邊查找相同的值
int temp = mid -1;
while(true) {
if(temp<0 || arr[temp]!=findVal) {
break;
}
list.add(temp);//如果找到相同的值就把下標存入list中
temp-=1;//讓下標減一蒋困,一直搜索到temp<0的位置
}
list.add(mid);//mid是已經找到的第一個下標,所以存入list
temp = mid+1;//同理 往右查找
while(true) {
if(temp>arr.length-1 || arr[temp]!=findVal) {
break;
}
list.add(temp);
temp+=1;
}
return list;
}
}
}