二分法

查找等于某个数的位置

// 查找等于某个数的位置
int binarySearch1(int *nums, int length, int value){
	int low = 0;
	int high = length - 1;
	while (low < high){
		int mid = (low + high) / 2;
		if (nums[mid] < value)
			low = mid + 1;
		else if (nums[mid]>value)
			high = mid - 1;
		else
			return mid;
	}
	if (nums[low] == value)
		return low;
	return -1;
}
复制代码

查找第一个大于某个数的位置

  直接上代码:测试

// 查找第一个大于某个数的位置
int binarySearch2(int *nums, int length, int value){
	int low = 0;
	int high = length - 1;
	while (low < high){
		int mid = (low + high) / 2;
		if (nums[mid] <= value)
			low = mid + 1;
		else
			high = mid;
	}
	// 结束时low和high必定相等,而且位置合法
	if (nums[low]>value)
		return low;
	return -1;
}
复制代码

查找最后一个小于某个数的位置

  和第一种状况同样,但要注意避免死循环问题。ui

// 查找最后一个小于某个数的位置
int binarySearch3(int *nums, int length, int value){
	int low = 0;
	int high = length - 1;
	while (low < high){
		int mid = (low + high) / 2;
		if (nums[mid] >= value)
			high = mid - 1;
		else {
			// 若是low==mid,那么将进入死循环,这是由于此时low+1==high
			if (low == mid){
				if (nums[high] < value)
					low = high;
				break;
			}
			low = mid;
		}
	}
	if (nums[low] < value)
		return low;
	return -1;
}
复制代码

测试用例

int main(){
	int nums[] = { 1, 2, 3, 4, 5 };
	printf("%d", binarySearch1(nums, 5, 1));
	printf("%d", binarySearch1(nums, 5, 2));
	printf("%d", binarySearch1(nums, 5, 3));
	printf("%d", binarySearch1(nums, 5, 4));
	printf("%d", binarySearch1(nums, 5, 5));
	printf("\n");
	printf("%d", binarySearch2(nums, 5, 1));
	printf("%d", binarySearch2(nums, 5, 2));
	printf("%d", binarySearch2(nums, 5, 3));
	printf("%d", binarySearch2(nums, 5, 4));
	printf("%d", binarySearch2(nums, 5, 5));
	printf("\n");
	printf("%d", binarySearch3(nums, 5, 1));
	printf("%d", binarySearch3(nums, 5, 2));
	printf("%d", binarySearch3(nums, 5, 3));
	printf("%d", binarySearch3(nums, 5, 4));
	printf("%d", binarySearch3(nums, 5, 5));
	return 0;
}
复制代码
相关文章
相关标签/搜索