二分搜索法

给定已经按照升序排好序的n个元素A[0,n-1],现要在这n个元素中找出一特定元素x

1.此时数组A是排好序的,我们要根据二分法来找出x,先将数组分成两部分,数组的开始left,数组的结束right,中间位置为mid.此时数组的左边部分为A[left,mid-1],右边部分为A[mid+1,right].

cs 复制代码
int mid=(left+right)/2;//中间元素为A[mid]

2.判断我们要找的元素x是否等于中间的元素A[mid],如果等于则不用再往下找了,此时直接返回mid的值(返回该特点元素x在数组中的位置)。

cs 复制代码
if(x==A[mid]){return mid;}

3.若我们找的元素x小于中间元素A[mid]的值,那结果应该在左边部分的数组中

cs 复制代码
if(x<A[mid]){
  binarySearch(A,x,left,mid-1);//若x小于A[mid],在数组左边区域,再次调用二分函数查找左边部分是否有等于x的值
} 

4.若我们找的元素x大于中间元素A[mid]的值,那结果应在右边部分的数组中

cs 复制代码
if(x>A[mid]){
  binarySearch(A,x,mid+1,right);//若x>A[mid],则利用二分法在右边部分的数组进行查找。
}

5.若查找到right<left时,则此时该元素并未存在(找不到)

cs 复制代码
if(right<left){
  return -1;
}

完整代码:

cs 复制代码
#include<stdio.h>
#include<malloc.h>
//二分搜索

int binarySearch(int A[],int &x,int left,int right) {
	if (right >= left) {
		int mid = (left + right) / 2;
		if (x == A[mid]) {
			return mid;
		}
		else if (x < A[mid]) {
			binarySearch(A, x, left, mid - 1);
		}
		else {
			binarySearch(A, x, mid + 1, right);
		}
	}
	else {
		return -1;
	}
}

int main() {
	int n,x;
	printf("请输入数组长度:");
	scanf_s("%d",&n);
	int* A=(int*)malloc(sizeof(int) * n);
	printf("请输入数组数据:");
	for (int i = 0; i < n;i++) {
		scanf_s("%d",&A[i]);
	}
	printf("请输入你要查找的数据:");
	scanf_s("%d",&x);
	int result=binarySearch(A,x,0,n-1);
	if (result>=0) {
		printf("查找结果在数组中的第%d个位置", result+1);
	}
	else {
		printf("未找到!");
	}

	return 0;
}

上面代码可以键盘输入数组的值,当然也可以直接确定A中的元素:

cs 复制代码
#include<stdio.h>
#include<malloc.h>
//二分搜索

int binarySearch(int A[],int &x,int left,int right) {
	if (right >= left) {
		int mid = (left + right) / 2;
		if (x == A[mid]) {
			return mid;
		}
		else if (x < A[mid]) {
			binarySearch(A, x, left, mid - 1);
		}
		else {
			binarySearch(A, x, mid + 1, right);
		}
	}
	else {
		return -1;
	}
}

int main() {
	int x;
    int A[5]={1,2,3,4,5};
	printf("请输入你要查找的数据:");
	scanf_s("%d",&x);
	int result=binarySearch(A,x,0,n-1);
	if (result>=0) {
		printf("查找结果在数组中的第%d个位置", result+1);
	}
	else {
		printf("未找到!");
	}

	return 0;
}
相关推荐
Jina AI22 分钟前
回归C++: 在GGUF上构建高效的向量模型
人工智能·算法·机器学习·数据挖掘·回归
Coovally AI模型快速验证27 分钟前
YOLO、DarkNet和深度学习如何让自动驾驶看得清?
深度学习·算法·yolo·cnn·自动驾驶·transformer·无人机
luoqice34 分钟前
linux下找到指定目录下最新日期log文件
linux·算法
楽码1 小时前
底层技术SwissTable的实现对比
数据结构·后端·算法
fffcccc11121 小时前
初级背包问题,层层剖析为什么这样做。最好需要自己推演一遍。
算法
瓦特what?2 小时前
关于C++的#include的超超超详细讲解
java·开发语言·数据结构·c++·算法·信息可视化·数据挖掘
楽码2 小时前
自动修复GoVet:语言实现对比
后端·算法·编程语言
杰克尼3 小时前
415. 字符串相加
算法
lifallen3 小时前
JCTools 无锁并发队列基础:ConcurrentCircularArrayQueue
java·开发语言·数据结构·算法
来自天蝎座的孙孙4 小时前
洛谷P1595讲解(加强版)+错排讲解
python·算法