二分搜索法

给定已经按照升序排好序的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;
}
相关推荐
Wendy14418 小时前
【线性回归(最小二乘法MSE)】——机器学习
算法·机器学习·线性回归
拾光拾趣录8 小时前
括号生成算法
前端·算法
渣呵8 小时前
求不重叠区间总和最大值
算法
拾光拾趣录9 小时前
链表合并:双指针与递归
前端·javascript·算法
好易学·数据结构9 小时前
可视化图解算法56:岛屿数量
数据结构·算法·leetcode·力扣·回溯·牛客网
香蕉可乐荷包蛋10 小时前
AI算法之图像识别与分类
人工智能·学习·算法
chuxinweihui10 小时前
stack,queue,priority_queue的模拟实现及常用接口
算法
tomato0910 小时前
河南萌新联赛2025第(一)场:河南工业大学(补题)
c++·算法
墨染点香11 小时前
LeetCode Hot100【5. 最长回文子串】
算法·leetcode·职场和发展
甄卷12 小时前
李沐动手学深度学习Pytorch-v2笔记【08线性回归+基础优化算法】2
pytorch·深度学习·算法