算法第二章上机实践报告
一.实验题目
7-1 二分查找 (20 分)
输入n值(1<=n<=1000)、n个非降序排列的整数以及要查找的数x,使用二分查找算法查找x,输出x所在的下标(0~n-1)及比较次数。若x不存在,输出-1和比较次数。
输入格式:
输入共三行: 第一行是n值; 第二行是n个整数; 第三行是x值。
输出格式:
输出x所在的下标(0~n-1)及比较次数。若x不存在,输出-1和比较次数。
代码实现:
#include <iostream>
using namespace std;
int count =0;
using namespace std;
int count =0;
int search(int b[],int c,int left,int right){
while(left<=right){
int mid = (left+right)/2;
if(c<b[mid]){
count++;
right =mid-1;
}
else if(c>b[mid]){
count++;
left = mid+1;
}
else {
count++;
return mid;
}
}
return -1;
}
int main(){
int a;
cin>>a;
int b[a];
for(int i=0;i<a;i++){
cin>>b[i];
}
int c;
cin>>c;
int left =0;
int right = a-1;
int d=search(b,c,left,right);
cout<<d<<endl;
cout<<count<<endl;
}
while(left<=right){
int mid = (left+right)/2;
if(c<b[mid]){
count++;
right =mid-1;
}
else if(c>b[mid]){
count++;
left = mid+1;
}
else {
count++;
return mid;
}
}
return -1;
}
int main(){
int a;
cin>>a;
int b[a];
for(int i=0;i<a;i++){
cin>>b[i];
}
int c;
cin>>c;
int left =0;
int right = a-1;
int d=search(b,c,left,right);
cout<<d<<endl;
cout<<count<<endl;
}
总结反思:在本次上机实践中,我们本想用迭代思路通过不断调用函数得出答案,最后测试时发现出现超时错误。而我们也没有找到问题的解决方案,错失了大量时间。最后采用递归方法,首先判断语句,在循环中分解数组,直到找到所需数字并返回,得到正确答案。这次题目并不难,但我们开始选择了我们并不擅长的方法,影响了编程效率,使我们意识到自己对基础知识的掌握还需大量练习和巩固。时间复杂度o (logn),空间复杂度o(1)