/** * 书本:《算法分析与设计》 * 功能:二分搜索 * 1、设a[0:n-1]是一个已排好序的数组。请改写二分搜索算法,使得当搜索元素x不在数组中的时候,返回小于x的最大元素 * 的位置I和大于x的最小元素位置j。当搜索元素在数组中的时候,I和j相同,均为x在数组中的位置 * 文件:lesson3.cpp * 时间:2014年11月4日19:50:20 * 作者:cutter_point */ #include <iostream> using namespace std; //这里a是用来搜索的序列,n是序列里面数据的个数,x是要找的数,i和j是用来找位置的 bool erFen(int *a, int n, int x, int& i, int& j) //i和j是两个引用 { int left = 0; //查找的起始点 int right = n - 1; //查找的终点 while (left < right) //只要还有数据没有被遍历,那就一直循环一直到找到,或者没有 { int mid = (left + right) / 2; //二分法的精髓,一分为二 if (x == a[mid]) //从中间开始比较 { i = j = mid; //如果正好是中间的那个数的话,把位置赋值给i,j cout << "位置是:" << mid+1<<endl; return true; } //如果不是中间那个地方的话 if (x > a[mid]) //由于是已经排好序了 { //得到当前小于x的元素的位置 j = mid; left = mid + 1; //把后半部分作为新的起点 } else { //得到当前大于x的元素位置 i = mid; right = mid - 1; //把前半部分作为新的数列 } } //如果没有找到 //i = right; //j = left; cout << "位置是:" << j+1 << " 和 " << i+1 << "之间" << endl; return false; } int main() { int n, x, i=0, j=0; n = 0; cout << "依次输入数列的长度n,要找的整数x(中间用空格隔开)" << endl; cin >> n >> x; int *a; a = new int[n]; cout << "输入数组数据:" << endl; for (int i = 0; i < n; ++i) { cin >> a[i]; } erFen(a, n, x, i, j); //i和j是两个引用 getchar(); return 0; }
原文地址:http://blog.csdn.net/cutter_point/article/details/41174983