提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:这里可以添加本文要记录的大概内容:
题目:给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
总结:
二分查找主要是在有序数组中查找目标值并返回下标。
核心思想:
1、获取中间值。
2、用目标值与中间值比较,确定目标值在左区间还是右区间。
3、重复第二步直到找到目标值。
在递归实现中,因为想要实现Recursion_BS函数的不断递归,而需要传入值格式为(arr,left,right,target)所以用一个bs_recur函数做中间值的处理。
提示:以下是本篇文章正文内容,下面案例可供参考
二分查找
1.递归
代码如下(示例):
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define ARR_LEN(arr) (sizeof(arr)/sizeof(arr[0]))
/*
递归二分查找
*/
int Recursion_BS(int arr[],int left,int right,int target)
{
if (left > right) {
return -1;
}
int middle = left + (right - left >> 1);
int diff = target - arr[middle];
if (diff>0) {
return Recursion_BS(arr, middle+1,right, target);//只取右区间递归
}
if (diff<0) {
return Recursion_BS(arr, left,middle-1, target);//只取左区间递归
}
}
int bs_recur(int arr[], int length, int target) {
//递归中需要返回(arr, middle+1,right, target)形成递归,用这个函数做传入值的中转
return Recursion_BS( arr, 0, length - 1,target);
}
int main(void) {
int target,index;
printf("输入想要查找的目标值:\n");
scanf("%d", &target);
int arr[] = { 1,2,3,4,5,6,7 };
int length = ARR_LEN(arr);
index = bs_recur(arr,length,target);
printf("目标值的下标为:%d\n",index);
return 0;
}
2.非递归
代码如下(示例):
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define ARR_LEN(arr) (sizeof(arr)/sizeof(arr[0]))
/*
循环二分查找
*/
int Search(int num[], int len,int tar) {
int left, right;
left = 0;
right = len - 1;
while (left<=right)//区间有值没找
{
//int middle = (left + right) / 2;
int middle = left + (right - left >> 1);
//中间查找索引的优化,右操作数代替除2
int diff = tar - num[middle];
if (diff > 0) {
left = middle + 1;
}
else if (diff < 0) {
right = middle - 1;
}
else
{
return middle;
}
}
return -1;
}
int main(void) {
int target=0;
printf("输入要查找的目标值\n");
scanf("%d", &target);
int num[] = { -1,0,3,5,9,12 };
int length = ARR_LEN(num);
int index_target = Search(num, length,target);
if (index_target == -1)
{
printf("数组中没有该查找值");
}
else {
printf("查找的目标值的下标为%d", index_target);
}
return 0;
}