- 一、前言
- 二、二分查找
- 三、如何用C语言实现二分查找
当我们需要在一串有序的数组中查找某个数字在这个数组中的排名时,我们该怎么做呢?还在用循环遍历整个数组后,找到跟目标相同的元素后打印下标的方法?不如试试二分查找,更快更高效,你值得拥有
二、二分查找二分查找法,又叫折半查找法。适合用在按顺序排列的数据中的查找行为,效率较高,这是二分查找法的优点,但也是其局限性。例如我们需要在一个按升序排列的数组中找到目标,我们可以以数组的中位数为基准,将数组分成两个子集,先将目标与中位数进行比较,若相同则直接返回中位数;若目标小于中位数则在中位数左侧的子集(数组为升序)继续使用二分查找,不断缩小查找范围,直到找到目标。同理,若目标大于中位数则在中位数右侧的子集中查找。
三、如何用C语言实现二分查找(1)确认数组的大小
int main()
{
int arr[] = {1,2.3,4,5,6,7,8,9,10};
int sz = size(arr)/sizeof(arr[0]);//数组的总大小除以数组首元素的大小,即可求出数组大小
int left = 0; //数组下标都是从0开始的
int right = sz-1; //数组最后元素的下标为数组大小-1
}
(2)确认数组的中位数下标
int main()
{
int mid = (left+right)/2;
}
注意:
若 left 与 right 之和为奇数,除以2后得到的数会有小数点。而这里定义的mid是以整数的形式存储,在C语言中,不会进行我们生活中常用的四舍五入的方式计算,而是会将小数部分舍弃后存储。假设(left+right)/2的结果为4.5,则mid的值就为4
(3)比较目标与中位数的大小
若目标等于中位数,直接返回中位数的下标;若目标大于或小于中位数,则将left或者right的值改变,按新的值重新计算中位数,直到找到目标为止;而当left的值大于right的值时,就代表在该数组中没有目标
#include
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int sz = sizeof(arr) / sizeof(arr[0]);
int k = 0;
printf("请输入需要查找的1-10之间数字:");
scanf("%d",&k);
int left = 0;
int right = sz - 1;
while (left <= right)
{
int mid = (left + right) / 2;
if (k > arr[mid]) //若K大于中位数mid
{
left = mid + 1; //left等于mid右边的数
}
else if (k < arr[mid]) //若K小于中位数mid
{
right = mid - 1; //right等于mid左边的数
}
else
{
printf("找到了,数字下标是%d\n", mid);
break;
}
}
if (left > right)
{
printf("找不到\n");
}
return 0;
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)