数组中二分法的使用

力扣上经典题目数组中的应用题:《给定一个 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;
	}
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值