折半查找(代码+测试)
折半查找(binary search)的基本思想是: 假设有序表按关键码升序(或降序)排列,取中间记录作为比较对象,若给定值与中间记录相等,则查找成功;若给定值小于中间记录,则在有序表的左(右)半区继续查找;若给定值大于中间记录,则在有序表的右(左)半区继续查找。 不断重复上述过程,直到查找成功,或查找区域无该记录,查找失败。
折半查找有两种实现方法,非递归算法和递归算法。
非递归算法
int BinSearch1(int* arr, int n, int k){
//arr为待查找的有序数组,n为元素个数,k为待查找值
int mid, left = 1, right = n;
while(left <= right){
mid = (left + right) / 2;//取中间记录
if(k < arr[mid])
right = mid - 1;
else if(k > arr[mid])
left = mid + 1;
else return mid;
}
return 0;//数组元素下标是从1开始,因此返回0表示查找失败
}
递归算法
int a[11];
int BinSearch2(int left, int right, int k){
if(left > right) return 0;
else{
int mid = (left + right) / 2;
if(k < a[mid])
return BinSearch2(left, mid - 1, k);
else if(k > a[mid])
return BinSearch2(mid + 1, right, k);
else return mid;
}
}
测试
int main(){
int arr[11] = {0, 2, 5, 7, 9, 15, 16, 17, 23, 46, 52};
for (int i = 0; i < 11; ++i)
a[i] = arr[i];
cout << "使用非递归查找9的下标:" << BinSearch1(arr, 11, 9) << endl;
cout << "使用递归查找15的下标:" << BinSearch2(0, 11, 15) << endl;
return 0;
}
输入输出