二分查找:
介绍:首先我们思考这样一个问题:在一个有序数组中,如何找到某一个数,最先想到的一定是暴力枚举
代码:
#include <stdio.h>
int main()
{
int m = 0;
scanf("%d", &m);
int i = 0;
int a = 0;
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int sz = sizeof(arr) / sizeof(arr[0]);
for (i = (arr[0]-1); i < sz; i++)
{
if (arr[i] == m)
{
printf("找到了,并且下标是%d\n",i);
a++;
}
}
if(a==0)
{
printf("找不到\n");
}
return 0;
}
例子仅仅是十个数据,如果是十万个
数据,想要寻找最后一个数据,那就要浪费很多时间。
所以,对于有序数组的数据查找,我们将会使用二分查找法
代码:
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int left = 0;//代表第一个数据的下标
int right = (sizeof(arr) / sizeof(arr[0]) - 1);//代表着最后一个数据的下标
int mid = 0;//记录中间元素的下标
int find;//标记变量
while (left <= right)
{
mid = (left + right) / 2;
if (arr[mid] > n)
{
right = mid - 1;
}
else if (arr[mid] < n)
{
left = mid + 1;
}
else
{
find=1;
break;
}
}
if (find == 1)
{
printf("找到了,下标是%d\n", mid);
}
else
{
printf("找不到\n");
}
return 0;
}
但是这里还是有进一步优化的空间
就是对 mid=(left+right)/2;
因为int 最大数据为21亿多一点,所以假设两个数据都为12亿,那么就会发生运算错误。
我们优化的方式为mid=((right-left)/2)+left
平时写代码的时候就要注意这些问题