Hello,大家好!我是鸿,今天跟大家分享一下二分查找法的相关知识点,希望对大家理解二分查找法有所帮助。
目录
一、二分查找法的概念
二分查找法(Binary Search)又称为折半查找法,它是一种在有序数组里查找特定元素的高效算法。它通过不断将查找区间分成两部分,缩小查找范围,直到找到目标元素或者确定目标元素不存在。
二、二分查找法的实现:
在一个有序的数组中,我们首先要求出这个数组的长度length,进而得到这个数组最右边的下标:high=length-1然后通过最左边的下标:left=0和high求出这个数组中间下标:mid=(left+high)/2,这是我们就可以通过中间下标mid把这个数组分为两部分,下标比mid小的部分和下标比mid大的部分。假设这个有序数组是:arr[10] = { 1,2,3,4,5,6,7,8,9,10 },需要查找的元素:a=3,我们能得到left=0、high=9、mid=(0+9)/2=4,(mid向下取整)通过对下标为mid这个元素和我们需要查找的元素的值进行比较我们可以得到三种结果:
1、mid大于我们要查找的值。
对于情况1,我们可以将mid右边的部分排除,然后对high和mid进行更新:high=mid-1,mid=(left+high)/2 。
2、mid小于我们要查找的值。
对于情况2,我们可以将mid左边的部分进行排除,然后对left和mid进行更新:left=mid+1,mid=(left+high)/2。
3、mid等于我们查找的值。
对于情况3我们就能找到我们需要查找的元素了。
然后根据结果循环判断,知道我们找到需要查找的元素或者当left>high找不到时我们就可以退出循环了。
三、运行结果及代码示例:
int binary_search(int arr[], int k, int length)
{
int left = 0;
int right = length - 1;
while (left<=right)
{
int mid = (left + right) / 2;
//int mid = left + (right - left) / 2;
if (arr[mid] < k)
{
left = mid + 1;
}
else if (arr[mid] > k)
{
right = mid - 1;
}
else
{
return mid;
}
}
return -1;
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int k = 0;
printf("请输入要查找的值:\n");
scanf("%d", &k);//输入的是要查找的值
int length = sizeof(arr) / sizeof(arr[0]);
int ret = binary_search(arr, k, length);
if (ret == -1)
{
printf("找不到\n");
}
else
{
printf("找到了,下标是:%d\n", ret);
}
return 0;
}
能找到:
不能找到:
四、总结
- 定义一个左指针和一个右指针,初始时左指针指向数组的第一个元素,右指针指向数组的最后一个元素。
- 计算左右指针的中间位置,即 mid = (left + right) / 2。
- 将中间位置的元素与目标元素进行比较:
- 如果中间元素等于目标元素,则找到了目标元素,返回位置。
- 如果中间元素大于目标元素,则目标元素必然在左半部分,更新右指针为 mid - 1。
- 如果中间元素小于目标元素,则目标元素必然在右半部分,更新左指针为 mid + 1。4.
- 重复步骤 2 和步骤 3,直到左指针大于右指针,表示没找到目标元素,返回 -1。
二分查找法的时间复杂度是 O(logn),其中 n 是数组的长度。它的效率非常高,适用于对有序数组进行查找操作。