方法一:顺序查找
#include <stdio.h>
int main()
{
int arr[]={1,2,3,4,5,6,7,8,9,10};
int k =7;
int sz=sizeof(arr)/sizeof(arr[0]);
int i = 0;
for(i=0;i<sz;i++)
{
if(k==arr[i])
{
printf("找到了,下标为:%d\n",i);
break;
}
}
if(i==sz)
printf("没有找到\n");
return 0;
}
方法二:折半查找
#include <stdio.h>
int main()
{
int arr[] = {1,2,3,4,5,6,7,8,9,10};
int k = 7;
int sz = sizeof(arr)/sizeof(arr[0]);//计算元素个数
int left = 0;//左下标
int right = sz-1;//右下标
while(left<=right)//循环判断条件左下标一定要小于等于右下标
{
int mid = (left+right)/2;//想好为什么mid要放在循环里面,若放在循环外面那么循环内部的mid是恒定不变的
if(k<arr[mid])
{
right = mid-1;
}
else if (k>arr[mid])
{
left = mid+1;
}
else
{
printf("找到了,下标为:%d\n",mid);
break;
}
}
if(left>right)
{
printf("没有找到\n");
}
return 0;
}
什么是折半查找,怎么使用呢?
折半查找(Binary Search),也称为二分查找,是一种高效的搜索算法,用于在有序数组中查找特定元素的位置。
折半查找的基本思想是:
1. 将目标值与数组的中间元素进行比较。
2. 如果目标值等于中间元素,则找到了目标值,结束搜索。
3. 如果目标值小于中间元素,说明目标值在数组的左半部分,将搜索范围缩小为左半部分,并重复步骤1。
4. 如果目标值大于中间元素,说明目标值在数组的右半部分,将搜索范围缩小为右半部分,并重复步骤1。
5. 如果最终搜索范围为空,则表示目标值不在数组中。
以下是一个示例代码,展示如何使用折半查找算法在已排序的数组中查找目标值:
def binary_search(arr, target):
low = 0
high = len(arr) - 1
while low <= high:
mid = (low + high) // 2
mid_val = arr[mid]
if mid_val == target:
return mid
elif mid_val < target:
low = mid + 1
else:
high = mid - 1
return -1 # 目标值不在数组中
# 示例用法
arr = [2, 5, 8, 12, 16, 23, 38, 56, 72, 91]
target = 23
result = binary_search(arr, target)
if result != -1:
print(f"目标值 {target} 的索引为 {result}")
else:
print(f"目标值 {target} 不在数组中")
以上代码将输出:"目标值 23 的索引为 5",表示目标值23在数组索引为5的位置上。
需要注意的是,折半查找要求数组必须是有序的,否则可能得不到正确的结果。在每次比较后,折半查找将搜索范围减半,因此它的时间复杂度是O(log n),其中n是数组的大小。相比线性搜索,折半查找具有更高的效率。