二分查找的前提是数据有序,二分查找的性能十分优秀。时间复杂度为O(log2n)
非递归
int binsearch(int arr[],int len,int value){
//low和high指向当前查找区间的两端,value为查找的关键字
int low=0;
int high=len-1;
int mid;//当前区间的中间
while(low <= high){
mid = low + (high-low)/2;
//mid = (low+high)/2;这样的写法会有整型相加溢出的bug
if(arr[mid] == value){
return mid;//返回下标
}
if(value < arr[mid]){
high = mid-1;
}
else{
low = mid+1;
}
}
return -1;//未查找到返回-1
}
递归
int binsearch(int arr[],int left,int right,int value){
//递归出口
if(left > right){
return -1;
}
mid = low + (high-low)/2;
if(arr[mid] == value){
return mid;
}
else if(arr[mid] > value){
return binsearch(arr,left,mid-1,value);
}
else{
return binsearch(arr,mid+1,right,value);
}
}
顺序查找的时间复杂度为O(n),相对于二分查找性能较差
int seqsearch(int arr[],int len,int value){
for(int i=0;i < len;++i){
if(arr[i] == value){
return i;
}
}
return -1;//未查找到返回-1
}