VS2019实现二分查找

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
	int arr[] = {1,2,3,4,5,6,7,8,9};
	while (1)
	{
		int k;
		printf("请输入一个整数:");
		scanf("%d", &k);
		int sz = sizeof(arr) / sizeof(arr[0]);
		int ret = binarry_search(arr, k,sz);
		if (ret == -1)
		{
			printf("%d不存在\n", k);
		}
		else
		{
			printf("存在,下标是:%d\n", ret);
		}
	}
	
	return 0;
}

int binarry_search(int arr[],int k,int sz)
{
	
	int left = 0;
	int right = sz-1;
	
	while (left <= right)
	{
		int mid = (left + right) / 2;
		if (arr[mid] < k)
		{
			left = mid + 1;
		}
		else if (arr[mid]>k)
		{
			right = mid - 1;
		}
		else
		{
			return mid;
		}
	}
	return -1;
}

使用二分查找的前提是有序数列,该代码是通过构造binarry_search(int arr[],int k,int sz)函数实现,有以下几点要注意:

1.传入函数binarry_search的参数sz要在main函数中得出结果,写成binarry_search(int arr[],int k)是错误的,int arr[]传入的并非使整个main中的全部数组,是arr[0]地址,也就是相当于起一个指针的作用。

2.int mid = (left + right) / 2要放在while循环中,不可放在while循环之外,因为mid是动态变化的,放在while循环之外意味着mid只跟新一次。

3.while (left <= right),不可写成left,以本文中的代码为例,当输入k=4时,left依次为0、1、2、3,right依次为8、3。当left=right不成立时,结果是“不存在”,显然与实际矛盾。

ps:新手写博客,感谢bilili比特鹏哥的免费输出,本博客主要来自整理比特鹏哥的视频加上自己的小结,欢迎各位大佬批评指正ヾ(◍°∇°◍)ノ゙!!

posted @ 2021-02-04 16:24  王九九  阅读(103)  评论(0)    收藏  举报