主要内容来自于互联网,自己做了一定的修改
1.为了保证范围不超过范围,我们需要在初始化的时候,让变量不超出范围。这样每次循环得到的新的范围是慢慢缩小的,不会越界。
2 返回t在数组x中第一次出现的位置。有可能t在数组中出现多次
#include<iostream>
using namespace std;
bool IsInvalidInput=false;
int BinarySearch(int a[],int length,int start,int end,int k)
{
if(a==NULL||length<0||start>length-1||end>length-1||start<0||end<0||start>end)
{
IsInvalidInput=true;
return -1;
}
while(start+1<end)
{
int middle=start+(end-start)/2;
if(a[middle]<k)
start=middle;//注意这里不能够写为middle+1形式,这样写的话计算数字在数组中第一次出现的位 //置的话会出现错误
else
end=middle;
}
if(a[end]!=k)
return -1;
else
return end;
}
int main ()
{
int a[]={1,2,3,4,5,6,6,6,8,9};
int length=sizeof(a)/sizeof(int);
int k=6;
int result=BinarySearch(a,length,0,length-1,k);
if(IsInvalidInput)
cout<<"Input is Invalid"<<endl;
else
{
if(result==-1)
cout<<"can't find"<<endl;
else
cout<<result<<endl;
}
return 0;
}
3 递归法写二分搜索
int BinarySearch_recurse(int *data,int length,int start,int end,int k) //递归实现二分查找(折半搜索)
{
if(data==NULL||length<0)
{
IsInvalidInput=true;
return -1;
}
if(start<=end)
{
int middle=start+(end-start)/2;
if(data[middle]<k)
BinarySearch_recurse(data,length,middle+1,end,k);
else if(data[middle]>k)
BinarySearch_recurse(data,length,start,middle-1,k);
else
return middle;
}
else
return -1;
}
4.以下是所做测试查找范围和循环的次数的关系,很明显,当查找范围是指数级的时候,循环次数是线性的。
1 1 2 2 4 3 8 4 16 5 32 6 64 7 128 8 256 9 512 10 1024 11 2048 12 4096 13 8192 14 16384 15 32768 15 65536 17 131072 15 262144 18 524288 196
对于咖啡罐中豆子的两种操作,不论是哪一种都会使得罐中的豆子减少1粒,所以该过程能够终止。我们每一步都从咖啡罐中拿掉0个或者是2个白豆,所以白豆的个数的奇偶性保持不变。因此,当且仅当罐中最初的白豆个数为奇数时,最后留下的豆子才可能是白色的。
7
根据yi<yi+1,则当x=0时,bi<bi+1。那么可以将实数对根据bi的大小排序。排序过后就是(a1,b1),(a2,b2)……而根据题意其对应于x在【0,1】范围内的值Yi<Yi+1,所以这就相当于把线段从小到大排序了。这里根据bi来进行二分查找。首先选取中间的线,看点在他上面还是下面,然后可以缩小一半的查找范围。
9
(1)两个n维的向量相加。初开始时:i=0表示前i个维度的都已经计算好了。在循环之中,计算一个维度,然后i加一,计算下一个维度,每个循环结束表明前i个维度已经计算完毕。i一直在增大,证明这个过程是可以终止的。当最后一个循环执行完毕的时候,i的值是n,表明前n个维度已经计算好了。所以其代码是正确的。
(2)求x数组的最大值。初开始时候,max=x[0]表示最大值是第一个数,i=1表示前i个数的最大值已经求出。每次循环时候,如果有比max大的数,就替换,当循环结束时候,前i个数的最大值就知道了。当整个过程结束时,i==n,所以前n个数的最大值可以求出。
(3)当循环找个一个t的时候,就停止循环,或者当i超出范围的时候停止。i在每一次循环的时候值都增加,所以这个算法是可以结束的。当超出范围的时候,返回-1,否则返回的就是第一次出现的位置,因为i的值是从小到大递增的。
(4)每次递归,问题的规模都是缩小的,所以问题可以在有限步骤内结束。每次递归完成一次,就可以得到上次层想要的运算结果,接着向上传递。