/**
* 书:《设计和算法分析》
* 特征:二进制搜索
* 1、建立a[0:n-1]是一排的阵列已经好序。请重写二进制搜索算法,因此,搜索元素时x不用时,该阵列。返回小于x最大的元素
* S档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;
}
版权声明:本文博客原创文章,博客,未经同意,不得转载。