博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
二分法
阅读量:7004 次
发布时间:2019-06-27

本文共 1832 字,大约阅读时间需要 6 分钟。

查找等于某个数的位置

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

转载于:https://juejin.im/post/5c25983df265da615304d53a

你可能感兴趣的文章