思路:首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;
否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一
子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为
止,此时查找不成功。
一、非递归实现:
#include <iostream>
// 二分查找:如果查找到,就返回在数组中的下标,否则返回-1
int searchBin(int arr[], int len, int x) {
int low, high, mid;
low = 0;
high = len - 1;
while(low <= high) {
mid = (low + high) / 2;
if(x == arr[mid])
return mid;
else if(x < arr[mid])
high = mid - 1;
else
low = mid + 1;
}
return -1;
}
int main(int argc, const char * argv[]) {
// insert code here...
int arr[] = {8, 10, 12, 15, 25, 27, 30, 38}; // 初始化数组
int len, x, loc; // len存储数组的实际长度,x要查找的数, loc位置
len = sizeof(arr) / sizeof(arr[0]); // 整个数组长度
// 获取数组的实际长度:while(arr[i] != '\0') {count++}
std::cout << "请输入要查找的数:\n";
while(std::cin >> x) {
loc = searchBin(arr, len, x); // 调用二分查找函数
if(loc >= 0)
std::cout << "在数组中找到了" << x << ",在数组中是第" << (loc + 1) << "个。\n";
else
std::cout << "在数组中找不到" << x << std::endl;
std::cout << "请继续输入要查找的数:\n";
}
return 0;
}
二、递归实现:
#include <iostream>
// 二分法:递归
int searchBin(int arr[], int x, int low, int high) {
int mid;
if(low > high)
return -1;
mid = (low + high) / 2;
if(x == arr[mid])
return mid;
else if(x < arr[mid])
return searchBin(arr, x, low, mid-1);
else
return searchBin(arr, x, mid+1, high);
}
int main(int argc, const char * argv[]) {
// insert code here...
int arr[] = {8, 10, 12, 15, 25, 27, 30, 38}; // 初始化数组
int len, x, loc; // len存储数组的实际长度,x要查找的数, loc位置
len = sizeof(arr) / sizeof(arr[0]); // 整个数组长度
std::cout << "请输入要查找的数:\n";
while(std::cin >> x) {
loc = searchBin(arr, x, 0, len-1); // 调用二分查找函数
if(loc >= 0)
std::cout << "在数组中找到了" << x << ",在数组中是第" << (loc + 1) << "个。\n";
else
std::cout << "在数组中找不到" << x << std::endl;
std::cout << "请继续输入要查找的数:\n";
}
return 0;
}