1.问题描述:用二分法查找一段有序数组中的某个整数,输出其下标,如果没找的这输出“Not be found”
2.问题分析:分析问题知这个问题分为三部分:(1)输入N个整数(2)将这N个整数进行排序(3)使用二分法进行查找;
3.算法设计:先输入一个整数N,用vector函数来储存这N个整数,用algorithm函数库中的sort()函数来将vector中的元素快速排序,用i来记录小的下标,j来记录大的下标,每一次都判断这个【i,j】区间内的中位数与目标整数p的关系,如果中位数大于p则将边界j进行缩小使其等于区间中位数,如果中位数小于p,则将边界i进行缩小,使其等于中位数。如果这个区间内的中位数等于p则输出改下标即(i+j)/2并用break跳出循环;如果i与j仅相差1,则表示没有找到p,输出“Not be found”,并用break跳出循环;
4.源代码:
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{
int N;
int p;
cin >> N ;
vector <int>m;
for (int i = 0; i < N; i++)
{
int k;
cin >> k;
m.push_back(k);
}
cin >> p;
sort(m.begin(), m.end());
for (int i=0,j=N-1;;)
{
if (m[(j+i)/ 2] > p)
{
j =( j + i) / 2;
}
if (m[(j + i) / 2] < p)
{
i = (j + i) / 2;
}
if (m[(j + i) / 2] == p) { cout << (j + i) / 2 << endl; break; }
if(j-1==i) { cout << "Not be found." << endl; break; }
}
return 0;
}