二分法

323 阅读1分钟

查找等于某个数的位置

// 查找等于某个数的位置
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;
}

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

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

// 查找最后一个小于某个数的位置
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;
}