二分查找(折半查找)binary search
O(log2n)(以2为底,n的对数)
条件:数列必须有序
非递归版(升序)
#include<stdio.h>
int erfen(int *a, int n, int target) {
if(n <= 0) {
return -1;
}
int start = 0, end = n-1;
while(start <= end) {
int mid = (start+end)>>1;
if(a[mid] == target) {
//查找最小target下标 mid-1 >= 0 && a[mid-1] == target end = mid-1;
if(mid+1 < n && a[mid+1] == target) { //查找最大target下标
start = mid+1;
} else {
return mid;
}
} else if(a[mid] > target) { //如果为降序则是start = mid+1;
end = mid-1;
} else {
start = mid+1;
}
}
return -1;
}
int main() {
int n,i,a[10];
scanf("%d", &n);
for(i=0; i<n; i++) {
scanf("%d", &a[i]);
}
printf("%d\n", erfen( a, n, 5));
}
递归版
#include<stdio.h>
int a[10];
int erfen(int n,int s, int e, int target) {
if(n <= 0) {
return -1;
}
if(s <= e) {
int mid = (s+e)>>1;
if(a[mid] == target) {
if(mid+1 < n && a[mid+1] == target) {
return erfen(n,mid+1,e,target);
} else {
return mid;
}
} else if(a[mid] > target) {
return erfen(n,s,mid-1,target);
} else {
return erfen(n,mid+1,e,target);
}
}
return -1;
}
int main() {
int n,i;
scanf("%d", &n);
for(i=0; i<n; i++) {
scanf("%d", &a[i]);
}
printf("%d\n", erfen(n,0, n-1, 5));
}