一、思路
- 首先確定該數組的中間的下標;
- 然後讓需要查找的數findVal和arr[mid]比較;
2.1 findVal>arr[mid],說明要查找的數在mid的右邊,因此需要遞歸地向右查找;
2.2 findVal<arr[mid],說明要查找的數在mid的左邊,因此需要遞歸地向左查找;
2.3 findVal==arr[mid],找到,返回;
- 什麼時候結束遞歸
3.1 找到結束遞歸;
3.2 遞歸完整個數組,仍然沒有找到findVal,left>right時結束。
二、代碼
public static int binarySearch(int[] arr, int left, int right, int findVal) {
if(left > right) {
return -1;
}
int mid = (left + right) / 2;
int midVal = arr[mid];
if(findVal > midVal) {
return binarySearch(arr, mid + 1, right, findVal);
}else if(findVal < midVal) {
return binarySearch(arr, left, mid - 1, findVal);
}else {
return mid;
}
}
三、當查找多個相同的數字時
public static ArrayList<Integer> binarySearch2(int[] arr, int left, int right, int findVal) {
if(left > right) {
return new ArrayList<Integer>();
}
int mid = (left + right) / 2;
int midVal = arr[mid];
if(findVal > midVal) {
return binarySearch2(arr, mid + 1, right, findVal);
}else if(findVal < midVal) {
return binarySearch2(arr, left, mid - 1, findVal);
}else {
ArrayList<Integer> resIndexList = new ArrayList<>();
int temp = mid - 1;
while (true) {
if(temp < 0 || arr[temp] != findVal) {
break;
}
resIndexList.add(temp);
temp -= 1;
}
resIndexList.add(mid);
temp = mid + 1;
while (true) {
if(temp > arr.length - 1 || arr[temp] != findVal) {
break;
}
resIndexList.add(temp);
temp += 1;
}
return resIndexList;
}
}