二分查找是最基本的算法,復習了一下發現還有很多根本沒有考慮的情況,特別記錄一下
1:最基本的二分查找
function binarySearch(arr, k){
let left = 0;
let right = arr.length - 1;
while(left <= right){
let mid = parseInt((left+right)/2);
if(arr[mid] == k){
return mid;
}else if(arr[mid] < k){
left = mid + 1;
}else{
right = mid - 1;
}
}
}
2.1 查找第一個與key相等的元素
查找第一個相等的元素,也就是說等于查找key值的元素有好多個,返回這些元素最左邊的元素下標。
static int findFirstEqual(int[] array, int key) {
int left = 0;
int right = array.length - 1;
// 這里必須是 <=
while (left <= right) {
int mid = (left + right) / 2;
if (array[mid] >= key) {
right = mid - 1;
}
else {
left = mid + 1;
}
}
if (left < array.length && array[left] == key) {
return left;
}
return -1;
}
2.2 查找最后一個與key相等的元素
查找最后一個相等的元素,也就是說等于查找key值的元素有好多個,返回這些元素最右邊的元素下標。
static int findLastEqual(int[] array, int key) {
int left = 0;
int right = array.length - 1;
// 這里必須是 <=
while (left <= right) {
int mid = (left + right) / 2;
if (array[mid] <= key) {
left = mid + 1;
}
else {
right = mid - 1;
}
}
if (right >= 0 && array[right] == key) {
return right;
}
return -1;
}
2.3 查找最后一個等于或者小于key的元素
查找最后一個等于或者小于key的元素,也就是說等于查找key值的元素有好多個,返回這些元素最右邊的元素下標;如果沒有等于key值的元素,則返回小于key的最右邊元素下標。
static int findLastEqual(int[] array, int key) {
int left = 0;
int right = array.length - 1;
// 這里必須是 <=
while (left <= right) {
int mid = (left + right) / 2;
if (array[mid] <= key) {
left = mid + 1;
}
else {
right = mid - 1;
}
}
if (right >= 0 && array[right] == key) {
return right;
}
return -1;
}
2.4 查找最后一個小于key的元素
查找最后一個小于key的元素,也就是說返回小于key的最右邊元素下標。
static int findLastSmaller(int[] array, int key) {
int left = 0;
int right = array.length - 1;
// 這里必須是 <=
while (left <= right) {
int mid = (left + right) / 2;
if (array[mid] >= key) {
right = mid - 1;
}
else {
left = mid + 1;
}
}
return right;
}
2.5 查找第一個等于或者大于key的元素
查找第一個等于或者大于key的元素,也就是說等于查找key值的元素有好多個,返回這些元素最左邊的元素下標;如果沒有等于key值的元素,則返回大于key的最左邊元素下標。
static int findFirstEqualLarger(int[] array, int key) {
int left = 0;
int right = array.length - 1;
// 這里必須是 <=
while (left <= right) {
int mid = (left + right) / 2;
if (array[mid] >= key) {
right = mid - 1;
}
else {
left = mid + 1;
}
}
return left;
}
2.6 查找第一個大于key的元素
查找第一個等于key的元素,也就是說返回大于key的最左邊元素下標。
static int findFirstLarger(int[] array, int key) {
int left = 0;
int right = array.length - 1;
// 這里必須是 <=
while (left <= right) {
int mid = (left + right) / 2;
if (array[mid] > key) {
right = mid - 1;
}
else {
left = mid + 1;
}
}
return left;
}