力扣上经典题目数组中的应用题:《给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。》
1.对于二分法的使用前提是必须是一个有序的数组或者有序的顺序表;
例如:a[]={1,2,3,5,7,8,9,11,12,,13};
2.二分法也就是对一组数据进行无限次数地二分,直到找到目标值,也就是取数组中中间的数值与其目标值比较(前提是left<=right){对于这个区间可以选择左闭右闭(则是left<=ringt)也可以是left<right,(左闭右开)},如果目标值>nums[mid],则让left=mid+1,如果目标值<nums[mid],则让right=mid-1,如果==,则直接返回目标值==nums[mid]; 这块需要调用函数,每次目标值未找到时,继续返回循环二分;
int mid = (left + right) / 2;
if (left <= right)
{
if (a[mid] == target)
{
return mid;
}
else if (a[mid] > target)
{
right = mid - 1;
return search(a, left, right, target);
}
else
{
left = mid + 1;
return search(a, left, right, target);
}
}
else
{
return -1;
}
3.对于自变量定义需注意,注意别重复定义,对变量 int aum=1,进行初始化后,直接引用aum,电脑默认为int ,后边无需继续定义int aum=sizeof(a)/sizeof(int), 应该是aum=sizeof(a)/sizeof(int);
错误代码如下:
int a[] = { 1, 3, 9, 11, 18, 25, 68, 75, 85, 89};
int time,target,left=0;
int aum=1;
int aum = sizeof(a) / sizeof(int);
printf("%d",aum);
,对于主函数中,需要对于数组的左界限跟右界限进行处理,aum算下来的值是元素个数,对于边界中是数组下标界限,从0开始,所以对与右界限为 rignt=aum-1;
完整代码如下(该代码更详细无注解):
#include<stdio.h>
#define EXAMPLE_MACRO_NAME
int search(int a[],int left,int right,int target);
int main()
{
int a[] = { 1, 3, 9, 11, 18, 25, 68, 75, 85, 89};
int time=1,target,left=0;
printf("输入要查询的目标值");
scanf("%d",&target);
int aum = sizeof(a) / sizeof(int);
time=search(a,0,aum-1,target);
if (time == -1)
{
printf("无法查询到该目标值");
}
else
{
printf("目标值的下标是%d", time);
}
return 0;
}
int search(int a[], int left,int right,int target)
{
int mid = (left + right) / 2;
if (left <= right)
{
if (a[mid] == target)
{
return mid;
}
else if (a[mid] > target)
{
right = mid - 1;
return search(a, left, right, target);
}
else
{
left = mid + 1;
return search(a, left, right, target);
}
}
else
{
return -1;
}
}
4.带注释代码
#include <stdio.h>
// 二分查找,找到元素返回索引值,否则返回-1
int binarySearch(int arr[], int low, int high, int target)
{
if (low <= high) //一直在里面循环,整型处理
{
int mid = (low + high) / 2; // 每次递归重新给mid赋值,改变中间值的下标
if (arr[mid] == target)
{ // 如果中间值等于目标值,说明查找成功,返回下标
return mid;
}
else if(arr[mid] > target)
{ // 如果中间值大于目标值,说明目标值在左半边
high = mid - 1;
return binarySearch(arr, low, high, target); // 继续查找左半边
}
else
{ // 如果中间值小于目标值,说明目标值在右半边
low = mid + 1;
return binarySearch(arr, low, high, target); // 继续查找右半边
}
}
else {
return -1;
}
}