二分查找
1.二分查找分为普通查找,寻找相等元素第一个位置,相等元素最后一个位置。
2.还需要注意的是mid的计算,采用mid=low+(high-low)/2是为了避免这种计算方式mid=(low+high)/2,当low和high较大时,超出数据类型允许的范围。
public class BinarySearch {
//设置mid,mid=low+(high-low)/2,保证整个公式不超出其数据类型范围;
//若设置mid=(low+high)/2,则若此时low和high都比较大,则low+high会超出相应的数据类型范围。
public int binarySearch(int[] arr, int val) {
int low = 0;
int high = arr.length - 1;
int mid = 0;
while (low <= high) {
mid = low + (high - low) / 2;
if (val < arr[mid])
high = mid - 1;
else if (val > arr[mid])
low = mid + 1;
else
return mid;//找到相等的元素后,更新high值
}
return -1;
}
//寻找首次出现目标值的元素,此时设置变量index,令index等于与目标值相等的下标。然后更新high值,在相等元素值的左侧继续查找;
// 直到high比low的位置小,此时比较low位置的元素是否等于目标值,若等于则更新index,返回index;若不等于,则直接返回index
public int firstBinarySearch(int[] arr, int val) {
int low = 0;
int high = arr.length - 1;
int index = 0;
int mid = 0;
while (low <= high) {
mid = low + (high - low) / 2;
if (val < arr[mid])
high = mid - 1;
else if (val > arr[mid])
low = mid + 1;
else {
index = mid;
high = mid - 1;
}
}
return index;
}
//寻找最后一次出现目标值的元素,设置变量index,令index等于与目标值相等的下标。然后更新low值,在相等元素值的右侧继续查找;
// 直至low比high的位置大,返回index
public int lastBinarySearch(int[] arr, int val) {
int low = 0;
int high = arr.length - 1;
int index = 0;
int mid = 0;
while (low <= high) {
mid = low + (high - low) / 2;
if (val < arr[mid])
high = mid - 1;
else if (val > arr[mid])
low = mid + 1;
else {
index = mid;
low = mid + 1;
}
}
return index;
}
public static void main(String[] args) {
BinarySearch bs = new BinarySearch();
int arr[] = {1, 1, 1, 1, 2, 4, 4, 12, 24};
int i = 1;
System.out.print("二分查找:" + bs.binarySearch(arr, i));
System.out.println();
System.out.print("返回第一个相等元素下标:" + bs.firstBinarySearch(arr, i));
System.out.println();
System.out.print("返回最后一个相等元素下标" + bs.lastBinarySearch(arr, i));
}
}