算法第二章上机实践报告
2020-12-13 14:45
标签:输入格式 搜索 ace 二分 输出 ide 其他 方法 end 一、实践题目———二分查找 二、问题描述 输入n值(1二分查找算法查找x,输出x所在的下标(0~n-1)及比较次数。若x不存在,输出-1和比较次数。 输入共三行: 第一行是n值; 第二行是n个整数; 第三行是x值。 输出x所在的下标(0~n-1)及比较次数。若x不存在,输出-1和比较次数。 算法第二章上机实践报告 标签:输入格式 搜索 ace 二分 输出 ide 其他 方法 end 原文地址:https://www.cnblogs.com/chenyuqi32-2-11/p/11569184.html输入格式:
输出格式:
输入样例:
4
1 2 3 4
1
输出样例:
0
2
三、算法描述
主要是运用递推的方法,不断的折半查找x,如果查找不到x,devide_selsct将会返回-1;而查找次数,则交给全局变量i。
#include
using namespace std;
int i = 0;
int devide_select(int a[], int x, int left, int right){
if( left i++;
int mid = (left + right) / 2 ;
if( a[mid] == x ) return mid;
if( a[mid] > x ) return devide_select( a, x, left, mid - 1);
if( a[mid] }
else return -1;
}
int main(){
int n;
cin >> n;
int a[n];
for(int i = 0; i cin >> a[i];
int x;
cin >> x;
int x_sign = devide_select( a, x, 0, n-1);
cout cout }
四、算法时间及空间复杂度
1、时间复杂度
由于是递归的二分搜索算法所以,devide_selsct的时间复杂度为O(log n),而循环输入的时间复杂度为O(n),再加上其他语句的时间复杂度O(1),则可得算法的时间复杂度为,上面的相加,即O(n)
2、空间复杂度
这段代码里,向计算机请求的空间只有int和int[],他们的空间复杂度分别为O(1)和O(n),将他们相加即可得到算法的时间复杂度,即O(n)
五、心得体会
本来刚开始做这个题的时候,笔者以为是一道挺简单的题(本来也是挺简单的),但是呢,做的途中,却遇到过许多问题。比如输出错误,笔者犯了2次,首先是输出的格式,格式搞错了许多次。但解决完这个后,输出的结果还是错误,笔者左思右想,最后发现出现在了递归的return上,递归的某些地方没有return,导致数据输出错误。还遇到过许多问题,因篇幅问题,笔者就不展开讨论。
希望以笔者的例子来告诫大家,学算法还是要多学多试多练,你不试,不练,你永远不知道简单的算法里,你会犯多少错误。