二分查找程序实现

二分查找程序实现

使用二分法的前提是有序数组

有点麻烦并且low的写法
用while循环实现

#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
int main()
{
	int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	int left = 0;
	int right = sizeof(arr) / sizeof(arr[0])-1;
	int key = 0;
	scanf("%d", &key);
	int mid = 0;

	while (left <= right)
	{
		mid = left + (right - left) / 2;

		if (arr[mid] > key)
		{
			right = mid - 1;

		}
		else if (arr[mid] < key)
		{
			left = mid + 1;
		}

		else
		{
			break;
		}
	}
		//跳出循环 找到了从break跳出的 mid=key 或者是l不满足循环条件eft>right(即为找不到key)跳出了循环
		if (left <= right)
		{
			printf("找到了关键字位于为arr[%d]",mid);
		}
		else
		{
			printf("没有找到");
		}
	
	

	system("pause");
	return 0;
}

进阶版:建立Binary search 函数

#define _CRT_SECURE_NO_WARNINGS 1
#include
#include

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

		else
		{
			return mid;//找到了直接返回mid
		}
	}
		return -1;//没找到返回-1
	
}
int main()
{
	int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	int key = 0;
	scanf("%d", &key);
	int ret = 0;
	int sz = sizeof(arr)/ sizeof(arr[0]);
	ret = BinarySearch(arr, key, sz);
	if (-1==ret)
	{
		printf("没有找到");
	}
	else
	{
		printf("找到了关键字位于为arr[%d]", ret);
	}

	system("pause");
	return 0;
}

二分查找程序实现_第1张图片
建立二分法的函数,在函数里面实现循环
1.循环判断的条件:
为什么不写死循环??
如果找不到的条件下,right会移动到left 的前面,此时,程序会一直等待不会退出了。
while (left <= right)

2.不能用return 0 万一数组下标0 就是要找的怎么办?

3==.在语句里面要注意 else 后面直接跟语句,要加条件必须else if.
4. 传参的时候,数组下标是被忽略的! int arr[]
写在最后

本来这个应该十分钟就搞定,结果我出现了几个错误,在以下做个简单分析

1.又一次把等号和赋值符号给弄错
果然下一次我一定要把数字写到前面,气死我了,调试了三四次。
2. 循环里面if 多的时候要注意检查{ }
今天因为{} 的原因程序出错了
3. {}太多的时候一定要认真看语句的正确位置 这个错误害我又检查了很长时间

每天进步一点点加油嗷!!!

你可能感兴趣的:(笔记)