二分查找是一种基于比较目标值与数组中间元素的元素位置来确定目标值在数组中位置的查找算法。它的基本思想是将数组中间位置的元素值与目标值进行比较,如果相等则返回下标,否则根据比较结果折半查找左半部分或右半部分,直到找到目标值或者确定目标值不存在为止。
二分查找算法的时间复杂度为 O(log n),是一种非常高效的查找算法,适用于已排序的数组或有序的部分数据。
二分查找算法实现的基本步骤包括:
1. 定义要查找的目标值和有序数组。
2. 定义数组的左右边界,即左边下标和右边下标。
3. 取中间位置的下标,通过比较目标值和中间位置元素的大小得出应该在左边或右边查找。
4. 根据比较结果折半查找左半部分或右半部分,重复步骤 3 和步骤 4,直到查找到目标值或者确定目标值不存在为止。
程序的运行流程如下:
1. 首先读入需要查找的数值 `k` 和数组的大小 `m`。
2. 定义一个大小为 `m` 的整数数组 `a`,用于存储待查找的数值。
3. 使用循环逐个读入 `m` 个数值,将其存储到数组 `a` 中。k
4. 初始化数组的左边下标 `left` 为 0,右边下标 `right` 为数组长度减 1。
5. 进入二分查找循环,当左边下标小于等于右边下标时执行以下步骤:
- 计算中间元素的下标 `mid`,为左边下标和右边下标的平均值。
- 如果中间元素等于要查找的数值 `k`,则输出 "Found it,it is `mid`",mid是对应元素‘k’的下标,并结束程序。
- 如果中间元素大于要查找的数值 `k`,则说明在左半边搜索,将右边下标更新为 `mid - 1`。
- 如果中间元素小于要查找的数值 `k`,则说明在右半边搜索,将左边下标更新为 `mid + 1`。
6. 如果左边下标大于右边下标,则表示没有找到指定数值,输出 "NO Found"。
代码实现(升序数组的二分查找):
#include <stdio.h>
int main()
{
int k = 0;
printf("需要查找的数:");
scanf("%d",&k); //需要查找的数
int m;
printf("\n数组大小:");
scanf("%d",&m);
int a[m];
int i = 0;
printf("升序数组:");
for(i=0; i<m; i++)
{
scanf("%d",&a[i]);
}
int left = 0; //数组左边下标
int right = (sizeof(a))/ (sizeof(a[0])) - 1; //数组右边下标
while(left <= right)
{
int mid = (left + right) / 2;
if(a[mid] == k)
{
printf("Found it,it is %d",mid);
break;
}
else if(a[mid] > k)
{
right = mid - 1;
}
else
{
left = mid + 1;
}
}
if(left > right)
{
printf("NO Found");
}
}