今天介绍用遍历法和二分法查找一个有序数组中的某一个值
二分法查找的优点:二分法查找相比于遍历法效率更高,可以更快地解决问题。计算简单方法可靠,对f (x) 要求不高(只要连续即可),收敛性总能得到保证。
二分法查找的缺点:是无法求复根及偶重根,收敛慢。 二分法原理:设[a,b]为R的闭区间. 逐次二分法就是造出如下的区间序列([an,bn]):a0=a,b0=b,且对任一自然数n,[an+1,bn+1]或者等于[an,cn],或者等于[cn,bn],其中cn表示[an,bn]的中点。
下面用遍历法找一个数组中的某一值:
#include <stdio.h>
int main()
{
int syc[] = { 1,2,3,4,5,6,7,8,9,10 };
int k = 8;
int i = 0;
int sz = sizeof(syc) / sizeof(syc[0]);
for (i = 0; i <= sz; i++)
{
if (k == syc[i])
{
printf("找到了,下标是:%d\n,i");
break;
}
}
if (i == sz)
printf("找不到\n");
return 0;
}
结果如下:
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/bbe4486e8c6aff74ec30522642447427.png)
二分法查找:
#include <stdio.h>
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int k = 7;
int sz = sizeof(arr) / sizeof(arr[0]);
int left = 0;
int right = sz - 1;
while (left <= right)
{
int mid = (left + right) / 2;
if (arr[mid] > k)
{
right = mid - 1;
}
else if (arr[mid] < k)
{
left = mid + 1;
}
else
{
printf("找到了,下标是:%d\n",mid);
break;
}
}
if (left > right)
{
printf("找不到\n");
}
return 0;
}
计算结果:
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/5914db7a9dcd70b48ec2e5283d7539d3.png)
两种算法大家也可以分析一下利弊。