🎥 岁月失语唯石能言的个人主页
🔥个人栏专:秒懂C语言
⭐若在许我少年时,一两黄金一两风
一、二分查找的思路
二分查找也叫折半查找,二分查找针对的是一个有序的数据集合,每次都通过跟区间的中间元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间被缩小为 0。
举个例子:
朋友让你猜他刚买的一件衣服的价格,告诉你在(0~100)元之间。
我们一般都是先猜中间价位50元,他说猜低了,你再猜75元,这样一步步的缩减范围。直到锁定86元。你只要用几次二分查找就能找到价格。而你要是从一开始猜你得猜86次,速度和效率提升非常大。
二、思路分析
例子: int arr[] = {1,2,3,4,5,6,7,8,9,10};
首先题目会给你一个有序数组,让你找出某个数字比如说7的下标.
2.1定义变量
- 首先我们定义lift,right,key,mid四个变量。left的下标为0;right的下标用sizeof(arr)/sizeof(arr[0])-1 (整个数组的大小)/(一个数组元素的大小)-1 因为数组的下标是从0开始所以要减1。
- mid = (left + right) / 2;
如果left和right比较大的时候可能会越界,这时候可以改良一下:
-
mid = left+(right-left)/2;
2.2逻辑分析
- 然后我们需要拿arr[mid](50元)与key去比较大小然后不断缩小范围。
- 如果arr[mid] == key,那就说明找到了,直接打印。
- 如果arr[mid] > key说明你猜大了那你就要缩小范围1~100就要改成1~49(因为50比价格贵不需要取50元)所以right下标就要改成mid-1
- 同理,如果arr[mid] < key说明你猜小了那你就要缩小范围1~100就要改成51~100,left的下标改成mid+1
- 当然有人会担心mid = (left + right) / 2中(left + right)是奇数除出来不是整数怎么办。/ 符号位会自动舍掉余数不用当心。
- 然后在使用while循环来实现不断猜数字的过程
- while的条件就设置成left <= right,只要范围内还有数字就继续排查直到找出,例如3~5,直到找到只剩5~5,找到5。
- 或者全都找完了还找不到,这时候left和right会继续加减。这时left 就会大于 right,就打印找不到。
while (left <= right)
{
mid = (left + right) / 2;
if (arr[mid] == key)
{
printf("找到了,下标是%d\n", mid);
break;
}
if (arr[mid] > key)
{
right = mid - 1;
}
if (arr[mid] < key)
{
left = mid + 1;
}
}
if (left > right)
printf("找不到\n");
return 0;
三、代码实现
这是总的代码:
#include <stdio.h>
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int left = 0;
int right = sizeof(arr) / sizeof(arr[0]) - 1;
int key = 7;//要找的数字
int mid = 0;//记录中间元素的下标
while (left <= right)
{
mid = (left + right) / 2;
if (arr[mid] == key)
{
printf("找到了,下标是%d\n", mid);
break;
}
if (arr[mid] > key)
{
right = mid - 1;
}
if (arr[mid] < key)
{
left = mid + 1;
}
}
if (left > right)
printf("找不到\n");
return 0;
}
总结
以上就是关于二分查找的相关知识,二分查找虽然性能比较优秀,但应用场景也比较有限,底层必须依赖数组,并且还要求数据是有序的。所以我们在选用算法时需要从多方面考虑。