二分查找问题
问题描述:对于一个有序序列<a1,a2,a3…an>,查找元素num是否在序列中,如果存在,返回序列的下标,否则返回-1。
算法实现:
#include <iostream>
using namespace std;
//循环实现,时间复杂度:o(logn)
int binSer_loop (int a[], int len, int num) {
int left=0; //左游标
int right=len-1; //右游标
int mid;
while (left<=right) {
mid = (left+right)/2; //中游标,指向左右游标的中点
if (num>a[mid]) {
left = mid+1;
}
else if (num<a[mid]) {
right = mid-1;
}
else{
return mid;
}
}
return -1;
}
//递归实现,时间复杂度:o(logn)
int binSer_recur (int a[], int left, int right, int num) {
int mid;
if (left>right) {
return -1;
}
else{
mid = (left+right)/2;
if (num>a[mid]) {
return binSer_recur(a, mid+1, right, num);
}
else if (num<a[mid]) {
return binSer_recur(a, left, mid-1, num);
}
else{
return mid;
}
}
}
int main(){
int a[] = {1,3,5,8,10,12,16,18,22,27,32};
int *p = &a[0];
int len = sizeof(a)/sizeof(a[0]);
cout << binSer_loop(p, len, 32) << endl; //用循环方法查找32
cout << binSer_recur(p, 0, len-1, 22) << endl; //用递归方法查找22
return 0;
}