数组线性查找和二分查找

线性查找

线性查找与二分查找有些差别。
数组内元素可以是混乱无序的,即没有按顺序储存。这方法很简单,就是从首元素开始,依此向后查找,比较。仅此而已。运用循环,依次对比。
看代码吧。

#include <stdio.h>
int main(void)
{
	int arr[] = { 5,4,6,8,7,9,10,2,3,1 };
	int len = sizeof(arr) / sizeof(arr[0]);//计算数组的元素个数
	int n;
	scanf("%d", &n);//输入要查找的元素
	for (int i = 0; i < len; i++)
	{
		if (arr[i] == n)
		{
			printf("%d的下标是%d\n", n, i);
			break;//找到后就直接跳出循环
		}
	}
	if (i == len)//因为如果数组元素全部遍历一遍后,都没有i++等于len后,便跳出循环再判断说不存在。
		printf("Don't have number %d\n", n);	
	return 0;
}

线性查找非常简单但要是数组元素较大,就比较麻烦,毕竟要一个个遍历过去时间复杂度为 n。

二分查找

来看看二分查找,就是高中数学学到过的二分法,原理相当简单。但是它只能查找已经排序好的数组,与线性查找相比,有些局限性。
通过比较数组中间数据与目标数据的大小,来判断是在中间数据的左边还是右边,瞬间缩小一半的运算量。再按照这种继续比较,直到找到或找不到为止。

//二分查找
#include <iostream>
using namespace std;

int main()
{
	int a[] = {1,2,3,4,5,6,7,8,9};
	int n;
	int len = sizeof(a) / sizeof(int);
	/*while (cin>>n)
	{

	}*/
	cin >> n;
	int left = 0;
	int right = len - 1;
	int mid = 0;
	while (left <= right)
	{
		mid = (left + right) / 2;
		if (a[mid] > n)
		{
			right = mid-1;
		}
		else if (a[mid] < n)
		{
			left = mid+1;
		}
		else
		{
			cout << "找到了,数字是:" << a[mid] << endl;
			break;
		}
	}
	if (left > right)
	{
		cout << "没找到" << endl;
	}
	return 0;
}

看张图吧,方便理解与记忆。

看代码中的,中间元素是 5,在 5 的右边,再把不需要的元素移出比较范围,再,重新设置中间元素,进行比较。

再拿 8 进行比较,在 8 左边。重新规划范围。

7 比 6 大,则在 6 右边,继续比较。

此时,left==right, 跟据 while 循环条件,依旧可以进入循换,但 arr [mid]7, 说明已经找到那个元素,会 break; 跳出循环,再判断条件满足 left<=right,说明依旧成立,就输出。
否则,如果目标元素是 11,则一直会是中间元素的右边。

再 left=MID+1 就是 10, 此时,leftright,循环还没结束,这一次,mid 等于 10 还是比 11 小,left=10+1, 而此时,left>right,不符合条件,循环结束,再判断,不符合条件,就进入 else,,说明,11 不在数组内。
我第一次写二分查找时,没有写

1

2

left = mid+1;

right = mid-1;

而是写

1

2

right = mid;

left = mid;

本以为差不多,额,事实上确实差不多,不过当目标数据不在数组内时,要提前判断。如果直接以上面代码的形式,改条件,就会造成,left 一直是 9,right 一直是 10,mid 也一直是 9,无法跳出循环,造成这样的死循环局面。
当写二分查找时一定要切记。
这两个查护,目前就这些。
如有问题,烦请大佬指点一二。
谢谢观看。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

coder_Alger

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值