题目描述
已知一个按非递减有序序列的整数排列(12, 23, 30, 45, 48, 50, 67, 82, 91, 103)。编写一个程序,查找其中是否存在于给定key相等的数值。
问题分析
二分查找是指每次用key与位于查找区间中央位置的元素比较,比较结果将会产生下面3种情形之一。
- 如果相等,说明查找成功。
- 如果key小于中央位置的元素,说明如果存在这样的元素,应该位于查找区间的前半部分,此时可以将查找空间缩减为原来的一半,并在这一办的区间中继续用相同的方式查找。
- 如果key小于中央位置的元素,说明如果存在这样的元素,应该位于查找区间的前半部分,此时可以将查找空间缩减为原来的一半,并在这一办的区间中继续用相同的方式查找。
用key与当前查找区间中央位置的元素比较后,不是找到了,就是将查找区间缩小了一半。直到查找区间不存在了,说明没有要找的key。
程序代码
#include <iostream>
#define NUM 10
using namespace std;
void binary_search(int a[], int key) {
int low, high, mid;
low = 0; high = NUM - 1;
while (low <= high)
{
mid = (low + high) / 2;
if (a[mid] == key)
break;
if (a[mid] < key)
low = mid + 1;
else
high = mid - 1;
}
if (low < high)
cout << key << " is found at " << mid << endl;
else
cout << key << " is not found." << endl;
}
int main()
{
// 非递减整形数列
int value[NUM] = { 12, 23, 30, 45, 48, 50, 67, 82, 91, 103 };
int key;
cout << "Enter a key: " << endl;
cin >> key;
binary_search(value, key);
system("pause");
return 0;
}