二分搜索法

给定已经按照升序排好序的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;
}
相关推荐
weixin_457760002 分钟前
逻辑回归(Logistic Regression)进行多分类的实战
算法·分类·逻辑回归
元亓亓亓5 分钟前
LeetCode热题100--215. 数组中的第K个最大元素--中等
算法·leetcode·职场和发展
CoderYanger10 分钟前
C.滑动窗口-求子数组个数-越长越合法——2962. 统计最大元素出现至少 K 次的子数组
java·数据结构·算法·leetcode·职场和发展
Eiceblue16 分钟前
通过 C# 将 RTF 文档转换为图片
开发语言·算法·c#
alphaTao22 分钟前
LeetCode 每日一题 2025/12/8-2025/12/14
算法·leetcode
玖日大大23 分钟前
ModelEngine 可视化编排实战:从智能会议助手到企业级 AI 应用构建全指南
大数据·人工智能·算法
月明长歌27 分钟前
【码道初阶】Leetcode面试题02.04:分割链表[中等难度]
java·数据结构·算法·leetcode·链表
如竟没有火炬28 分钟前
快乐数——哈希表
数据结构·python·算法·leetcode·散列表
TL滕30 分钟前
从0开始学算法——第十四天(数组与搜索练习)
笔记·学习·算法
SoleMotive.33 分钟前
bio、nio、aio的区别以及使用场景
python·算法·nio