二分查找适用于有序的顺序表,时间复杂度为对数级别。
非递归实现:
//非递归
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;
}
运行结果: