/**
* 对不存在重复元素的数组 查找某元素
* 简单二分查找
*
* @param a
* @param n
* @param target
* @return
*/
public static int simpleBinarySearch(int[] a, int n, int target) {
int low = 0;
int high = n - 1;
while (low <= high) {
int mid = low + (high - low) / 2;
if (a[mid] == target) {
return mid;
} else if (a[mid] > target) {
high = mid - 1;
} else {
low = mid + 1;
}
}
return -1;
}
/**
* 二分查找 查找第一个等于定值的元素
*
* @param a
*/
public static int binarySearch(int[] a, int n, int target) {
int low = 0;
int high = n - 1;
while (low <= high) {
int mid = low + (high - low) / 2;
if (a[mid] > target) {
high = mid - 1;
} else if (a[mid] < target) {
low = mid + 1;
} else {
if (mid == 0 || a[mid - 1] != target) {
return mid;
} else {
high = mid - 1;
}
}
}
return -1;
}
/**
* 二分查找 查找最后一个值等于定值的元素
*
* @param a
*/
public static int binarySearchV2(int[] a, int n, int target) {
int low = 0;
int high = n - 1;
while (low <= high) {
int mid = low + (high - low) / 2;
if (a[mid] > target) {
high = mid - 1;
} else if (a[mid] < target) {
low = mid + 1;
} else {
if (mid == n - 1 || a[mid + 1] != target) {
return mid;
} else {
low = mid + 1;
}
}
}
return -1;
}
/**
* 二分查找 查找第一个大于等于给定值的元素
*
* @param a
*/
public static int binarySearchV3(int[] a, int n, int target) {
int low = 0;
int high = n - 1;
while (low <= high) {
int mid = low + (high - low) / 2;
if (a[mid] >= target) {
if (mid == 0 || a[mid - 1] < target) {
return mid;
} else {
high = mid - 1;
}
} else if (a[mid] < target) {
low = mid + 1;
}
}
return -1;
}
/**
* 二分查找 查找最后一个小于等于给定值的元素
*
* @param a
*/
public static int binarySearchV4(int[] a, int n, int target) {
int low = 0;
int high = n - 1;
while (low <= high) {
int mid = low + (high - low) / 2;
if (a[mid] > target) {
high = mid - 1;
} else if (a[mid] <= target) {
if (mid == n - 1 || a[mid + 1] > target) {
return mid;
}
low = mid + 1;
}
}
return -1;
}