#include<iostream>
#include<ctime>
#include<cassert>
using namespace std ;
//迭代版的binarySearch
int binarySearch(int arr[] , int n , int target){
int l = 0 , r = n - 1 ;
//在[l...r]的范围里寻找target;
//边界问题1
while(l <= r) {
//边界问题2
int mid = (l + r) / 2 ;
if(arr[mid] == target)
return mid ;
if(target > arr[mid])
l = mid + 1 ;
else{
r = mid - 1 ;
}
}
return - 1 ;
}
//递归版的二分查找
int binarySearch(int arr[] , int left , int right , int target){
if(left > right ){
return -1 ;
}
int mid = left + (right - left) / 2 ;
if(target == arr[mid]){
return mid ;
} else if(target < arr[mid]){
right = mid - 1;
return binarySearch(arr , left , right , target) ;
} else {
left = mid + 1;
return binarySearch(arr , left , right , target) ;
}
}
int* generateOrderArray(int n){
int *arr = new int[n] ;
for(int i= 0; i < n ;i ++){
arr[i] = i ;
}
return arr ;
}
int main(){
int n = 1000000 ;
int *data = generateOrderArray(n) ;
clock_t startTime = clock() ;
for(int i = 0; i < n ;i ++){
assert(i == binarySearch(data , 0 , n - 1, i));
}
clock_t endTime = clock() ;
cout<<"二分查找1000000个数:"<<endl ;
cout<<double(endTime - startTime) / CLOCKS_PER_SEC <<"S"<< endl ;
int arr[] = {1 ,2 , 3, 4, 5, 6 ,7 ,8} ;
clock_t startTime2 = clock() ;
cout<<"二分查找两个数:"<<endl ;
cout<<binarySearch(arr , 0 , 7 , 6) <<endl ;
cout<<binarySearch(arr , 0 , 7, 99) <<endl ;
clock_t endTime2 = clock() ;
cout<<double(endTime2 - startTime2) / CLOCKS_PER_SEC <<"S"<< endl ;
return 0 ;
}