【数据结构·考研】二分查找

二分查找适用于有序的顺序表,时间复杂度为对数级别。

非递归实现:

//非递归 
int BinarySearch(int* arr,int len,int key){ //数组、数组长度、关键字 
	int left = 0;
	int right = len - 1;
	while(left <= right){
		int mid = (left + right)/2;
		if(arr[mid] == key) return mid;
		else if(arr[mid] > key) right = mid - 1;
		else left = mid + 1;
	}
	return -1; //未找到 
} 

递归实现:

//递归 
int binarySearch(int* arr,int left,int right,int key){ //数组、左右边界、关键字 
	if(left > right) return -1; //未找到 
	int mid = (left + right)/2;
	if(arr[mid] == key) return mid;
	else if(arr[mid] > key) binarySearch(arr,left,mid - 1,key);
	else binarySearch(arr,mid + 1,right,key);
}

递归和非递归的长度差不多,但是非递归要更快,所以一般很少有人会写递归版。

全部代码:

#include<iostream>
using namespace std;

//非递归 
int BinarySearch(int* arr,int len,int key){ //数组、数组长度、关键字 
	int left = 0;
	int right = len - 1;
	while(left <= right){
		int mid = (left + right)/2;
		if(arr[mid] == key) return mid;
		else if(arr[mid] > key) right = mid - 1;
		else left = mid + 1;
	}
	return -1; //未找到 
} 

//递归 
int binarySearch(int* arr,int left,int right,int key){ //数组、左右边界、关键字 
	if(left > right) return -1; //未找到 
	int mid = (left + right)/2;
	if(arr[mid] == key) return mid;
	else if(arr[mid] > key) binarySearch(arr,left,mid - 1,key);
	else binarySearch(arr,mid + 1,right,key);
}

int main(){
	int arr[] = {0,1,2,3,4,5,6,7,8,9};
	cout<<BinarySearch(arr,10,5)<<endl;
	cout<<binarySearch(arr,0,9,5)<<endl;
	cout<<BinarySearch(arr,10,10)<<endl;
	cout<<binarySearch(arr,0,9,10)<<endl;
}

运行结果:

猜你喜欢

转载自blog.csdn.net/cjw838982809/article/details/108560391