查找算法之二分查找
二分查找,一个既简单,又实用,又容易被所有面试官问到的问题,可以可以
以下分为查找一个值和查找多个相同 的值
package cn.ycl.dataStructures.Search;
public class BinarySearch {
public static void main(String[] args) {
// TODO Auto-generated method stub
int arr[] = { 1, 4, 7, 9, 12, 90, 98 };
int binarySearch = binarySearch(arr, 0, arr.length-1, 12);
System.out.println(binarySearch);
}
public static int binarySearch(int arr[], int left, int right, int findVal) {
if (left>right) {
return -1;
}
int mid = (left + right) / 2;
if (arr[mid] < findVal) {
left = mid + 1;
return binarySearch(arr, left, right, findVal);
} else if (arr[mid]> findVal) {
right = mid - 1;
return binarySearch(arr, left, right, findVal);
} else {
return mid;
}
}
}
//以下为同时查找所有等于要查找的值,
package cn.ycl.dataStructures.Search;
import java.util.ArrayList;
import java.util.List;
public class BinarySearch {
public static void main(String[] args) {
// TODO Auto-generated method stub
int arr[] = { 1, 4, 7, 9, 12, 12, 90, 98 };
List<Integer> binarySearch = binarySearch(arr, 0, arr.length - 1, 12);
System.out.println(binarySearch.size());
for (Integer integer : binarySearch) {
System.out.println(integer);
}
}
public static List<Integer> binarySearch(int arr[], int left, int right, int findVal) {
if (left > right) {
return null;
}
int mid = (left + right) / 2;
if (arr[mid] < findVal) {
left = mid + 1;
return binarySearch(arr, left, right, findVal);
} else if (arr[mid] > findVal) {
right = mid - 1;
return binarySearch(arr, left, right, findVal);
} else {
ArrayList<Integer> list = new ArrayList<Integer>();
//相mid的左边扫描
int temp=mid-1;
while (true) {
if (temp<0|| arr[temp] !=findVal) {
break;
}
list.add(temp);
temp -=1;
}
list.add(mid);
//向mid的右边扫描
temp=mid+1;
while (true) {
if (temp>arr.length-1 || arr[temp] !=findVal) {
break;
}
list.add(temp);
temp +=1;
}
return list;
}
}
}