二分搜索法

给定已经按照升序排好序的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;
}
相关推荐
向阳@向远方14 分钟前
第二章 简单程序设计
开发语言·c++·算法
github_czy1 小时前
RRF (Reciprocal Rank Fusion) 排序算法详解
算法·排序算法
许愿与你永世安宁2 小时前
力扣343 整数拆分
数据结构·算法·leetcode
爱coding的橙子2 小时前
每日算法刷题Day42 7.5:leetcode前缀和3道题,用时2h
算法·leetcode·职场和发展
满分观察网友z2 小时前
从一次手滑,我洞悉了用户输入的所有可能性(3330. 找到初始输入字符串 I)
算法
YuTaoShao2 小时前
【LeetCode 热题 100】73. 矩阵置零——(解法二)空间复杂度 O(1)
java·算法·leetcode·矩阵
Heartoxx3 小时前
c语言-指针(数组)练习2
c语言·数据结构·算法
大熊背3 小时前
图像处理专业书籍以及网络资源总结
人工智能·算法·microsoft
满分观察网友z3 小时前
别怕树!一层一层剥开它的心:用BFS/DFS优雅计算层平均值(637. 二叉树的层平均值)
算法
杰克尼4 小时前
1. 两数之和 (leetcode)
数据结构·算法·leetcode