二分搜索法,它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用O(log n)完成搜索任务。它的基本思想是,将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比较,如果x=a[n/2]则找到x,算法终止。如果x<a[n/2],则我们只要在数组a的左半部继续搜索x(这里假设数组元素呈升序排列)。如果x>a[n/2],则我们只要在数组a的右半部继续搜索x。二分搜索法的应用极其广泛,而且它的思想易于理解,但是要写一个正确的二分搜索算法也不是一件简单的事。第一个二分搜索算法早在1946年就出现了,但是第一个完全正确的二分搜索算法直到1962年才出现。Bentley在他的著作《Writing Correct Programs》中写道,90%的计算机专家不能在2小时内写出完全正确的二分搜索算法。问题的关键在于准确地制定各次查找范围的边界以及终止条件的确定,正确地归纳奇偶数的各种情况,其实整理后可以发现它的具体算法是很直观的
#include <iostream>
using namespace std;
const int N = 101;
int quick_sort(int a[], int low, int high) {
int i, j, temp;
i = low;
j = high;
temp = a[i];
if (low >= high) return 0;
while (i < j) {
while (i < j && a[j] > temp) j--;
if (i < j) a[i++] = a[j];
while (i < j && a[i] < temp) i++;
if (i < j) a[j--] = a[i];
}
a[i] = temp;
quick_sort(a, low, i - 1);
quick_sort(a, i + 1, high);
return 0;
}
int find(int n, int a[], int low, int high) {
int mid = (low + high) / 2;
if (a[mid] == n)
return mid;
else if (a[mid] < n)
return find(n, a, mid + 1, high);
else if (a[mid] > n)
return find(n, a, low, mid - 1);
}
int main() {
int a[N];
int n, m;
int i, j;
int x;
cout << "请输入数字个数(n)查找次数(m)";
cin >> n >> m;
cout << "请输入" << n << "个元素";
for (i = 1; i <= n; i++) {
cin >> a[i];
}
quick_sort(a, 1, n);
cout << "请输入所需查找的" << m << "个对象";
for (i = 1; i <= m; i++) {
cin >> x;
cout << x << "在序列中从小到大排";
cout << find(x, a, 1, n);
cout << "位";
cout << endl;
}
system("pause");
}