使用遍历法查找数据时,花费时间较长,代码效率不高,我们至多需要N(N为数组个数)次才能找到需要的数据;
如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int k;
scanf("%d", &k);
int a[] = { 1,2,3,4,5,6,7,8,9,10 };
int i = 0;
while (1)
{
i++;
if (a[i] == k)
{
printf("找到了,下标是:%d\n", i);
break;
}
if (i > k)
{
printf("NULL\n");
break;
}
}
return 0;
}
而当使用二分法时,我们的效率便会提高许多;
那什么是二分法查找呢?
二分法查找是通过循环平分的方式,来进行查找想要的数或数据。
如果我们在数组中间查找数据,直接比较中间的数和所需要的数的大小,这样便可以查找一次就可筛选出很多不必要的数据;使用二分法我们至多便只需要次就可查找到所需内容(n为数组元素个数);
首先我们确定以下条件
数组个数的确定:sizeof(a)表示整个数组所占内存大小,再除每个单个的数组元素即得到数组个数;
得到数组个数后,右端的坐标自动就是数组个数减一,左端的坐标则是0;
若没有查到时,左右端点需要改变,以更加缩小范围。如:需查找的数k比中间数a[mid]大,则下次查找时,右端点不变,左端点变为mid值+1;所以此处就需要考虑到,当左右端点范围剩下两位时,看大小时若还是没有查找到需要的数时,下一个范围它的左右端点坐标变成相同,若此时还未确认位置,即最后一位也不是想要找到的那位数,此时便需要停止循环。
这也就是我们循环的条件——左端点始终小于右端点;
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int a[] = { 1,2,3,4,5,6,7,8,9,10 };
int k;//所要查找的数字
scanf("%d", &k);
int s = sizeof(a) / sizeof(a[0]);//计算数组的个数
int right = s - 1;//右坐标
int left = 0;//左坐标
while (left <= right)
{
int mid = (right + left) / 2;//中间数的坐标
if (a[mid] > k)
{
right = mid - 1;
}
else if (a[mid] < k)
{
left = mid + 1;
}
else//如果查找的数与中间数相等
{
printf("找到了,下标是:%d\n", mid);
break;
}
}
if (left > right)//若没有找到
{
printf("NULL\n");
}
return 0;
}