hello,各位CSDN的各位你们好啊,今天小赵要分享给你们的C语言知识是二分查找法。二
首先我们先了解一下究竟什么才是二分查找法。
二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好,占用系统内存较少;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
当然,简单一点来说就是我们将一组按升序排序的数组,从左边和右边两个方向夹击,来不断找到我们想要的那个数,并锁定它在我们数组的位置。
那么我们可以首先创建一个数组。
那么我们下面需要什么呢?根据我们二分查找法,是不断地去找数组的中间,那么我们如何才能知道一个数组的中间呢?其实我们可以换一种思维,我们如果知道这个数组一共有多少个,不就可以知道这个数组的中间了吗?那我们如何知道一个数组的中间位置呢,在这里我们可以借用sizeof语句来统计它的数组有多少个元素。那么我们该如何使用呢?这就不得不讲讲sizeof的使用了。
sizeof
sizeof就是统计它所统计的东西所占的内存,例如我们统计我们数组长度的时候统计的就是我们这个数组中所有元素所占的总长度。那么知道这个原理,我们就可以用我们统计的总长度除以我们一个数组中每一个元素所占的字节就可以得到我们的数组总长度了。
当然这里在补充一个知识点,如果我们的数组存入的元素是字符串时要特别注意。因为字符串,在我们的数组中存放又是不一样的。
相信看到这个答案很多人是很懵的为什么结果是这样的,那么下面小赵就告诉大家为什么会这样。
当我们存入字符串给数组的时候,它在内存中所占的形式是这样的
那么,我们的sizeof再统计的时候,会将\0,也算入我们的字符串长度。相信这样一讲很多人心中的疑惑是不是就解决了呢?那么我们继续我们的二分查找法。
既然是二分查找法,那么我们肯定要定义一个左边一个右边,和一个中间,左边我们可以用arr[0];右边我们arr[最后一个]来表示,中间我们则可以用总长度/2来表示,我们可以创建一个变量来存放我们要找的数字,然后进入循环,然后我们看这个数字是比中间的数字大还是小,如果比中间大,那么我们就把左边设为中间数,砍掉前面一半,再将我们的中间数设为(新的左边的+有点的)/2来不断循环直到找到我们想要的数字,同时我们的循环条件可以设置为左边比右边小;
#include <stdio.h>
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
int right = sizeof(arr1) / sizeof(arr1[0]);//右边为数组的总长度;
int left = 0;//左边为开头第一个
int key = 0;//要查的数字
printf("输入你要查找的数字:> ");
scanf("%d", &key);
int mid = 0;
int find = 0;//判断(看能不能查到)
while (right >= left)//判断条件
{
mid = (left + right) / 2;
if (arr1[mid] > key)//数字比中间数小
{
right = mid - 1;//把右边的改为之前的中间数
}
if (arr1[mid] < key)//数字比中间数大
{
left = mid + 1;//把左边改为原来的中间
}
else
{
find = 1;//如果找到了,find为1
break;
}
}
if (find == 1)//为1,找到了
{
printf("找到了,下标是%d\n", mid);
}
else
{
printf("找不到\n");
}
return 0;
好了,今天小赵的c语言分享就到这里了,咱们下期见!