/**
* 书本:《算法分析与设计》
* 功能:二分搜索
* 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