二分查找基础
普通解法
int BinarySearch(int *array, int size, int value) {
int low = 0, high = size - 1;
while (low <= high) {
int mid = low + ((high - low) >> 1);
if (array[mid] == value) {
return mid;
} else if (array[mid] < value) {
low = mid + 1;
} else {
high = mid - 1;
}
}
return -1;
}
迭代法
int BinarySearch(int *array, int low, int high, int value) {
if (low > high) return -1;
int mid = low + ((high - low) >> 1);
if (array[mid] == value) {
return mid;
} else if (array[mid] < value) {
return BinarySearch(array, mid + 1, high, value);
} else {
return BinarySearch(array, low, mid - 1, value);
}
}
二分查找进阶
查找第一个值等于给定值的元素
int BinarySearch1(int *array, int size, int value) {
int low = 0, high = size - 1;
while (low <= high) {
int mid = low + ((high - low) >> 1);
if (array[mid] == value) {
if (mid == 0 || array[mid - 1] != value) return mid;
high = mid - 1;
} else if (array[mid] < value) {
low = mid + 1;
} else {
high = mid - 1;
}
}
return -1;
}
查找最后一个值等于给定值的元素
int BinarySearch2(int *array, int size, int value) {
int low = 0, high = size - 1;
while (low <= high) {
int mid = low + ((high - low) >> 1);
if (array[mid] == value) {
if (mid == size - 1 || array[mid + 1] != value) return mid;
low = mid + 1;
} else if (array[mid] < value) {
low = mid + 1;
} else {
high = mid - 1;
}
}
return -1;
}
查找第一个大于等于给定值的元素
int BinarySearch3(int *array, int size, int value) {
int low = 0, high = size - 1;
while (low <= high) {
int mid = low + ((high - low) >> 1);
if (array[mid] >= value) {
if (mid == 0 || array[mid - 1] < value) return mid;
high = mid - 1;
} else {
low = mid + 1;
}
}
return -1;
}
查找最后一个小于等于给定值的元素
int BinarySearch4(int *array, int size, int value) {
int low = 0, high = size - 1;
while (low <= high) {
int mid = low + ((high - low) >> 1);
if (array[mid] <= value) {
if (mid == size - 1 || array[mid + 1] > value) return mid;
low = mid + 1;
} else {
high = mid - 1;
}
}
return -1;
}