算法第二章上机实验报告

1、实践题目

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和比较次数。

输入样例:

4

1 2 3 4

1

输出样例:

0

2

 

2、问题描述

本道题是让我们输入非降序排列的整数,也就是说是排好序的了,然后输入我们要查找的数字,如果找到了,就输出所找的那个数在数组中的位置并输出比较的次数;如果没有找到的话,就输出-1还有比较的次数。

3、算法描述

使用二分法查找,每查找一次,问题规模减小为原来的一般,即将输入的序列存在一个数组里,假设要查找的数字为x,那么就是让x与a[n/2]比较。如果两者相等的话,那么x就找到了,算法结束。若是不相等的话,则根据x是大于a[n/2]还是小于a[n/2]决定是要在哪一部分里继续寻找。若x>a[n/2],则在数组的右半部分继续寻找;若x<a[n/2],则在数组的左半部分继续寻找。

代码如下:

#include <iostream>

using namespace std;

int BinarySearch(int a[],int x,int n){

int left = 0;

int right =n-1;

int count =0;

while(left <= right){

int middle = (left + right)/2;

count++;

if(x== a[middle]){

cout<<middle<<endl;

cout<<count;

return middle;

}

if(x>a[middle]){

left =middle + 1;

}

else {

right = middle -1;

}

}

cout<<"-1"<<endl;

cout<<count;

return -1;

}

int main(){

int n;

cin>>n;

int *a=new int[n];

for(int i=0; i<n;i++){

cin>>a[i];

}

int x;

cin>>x;

BinarySearch(a,x,n);

return 0;

}

4、算法时间及空间复杂度分析(要有分析过程)

对于n个元素:

第一次二分:n/2
第二次二分:n/2^2
......
m次二分:n/(2^m)
2^m=n;

故时间复杂度为:log2n 
空间复杂度:因为各个变量的空间复杂度都是O(1),所以算法空间复杂度为O(1)。

5、心得体会(对本次实践收获及疑惑进行总结)
这次的二分查找算法实践,加深了我对二分法的理解。因为书本上有二分法查找的相关内容,我们没出现大问题。问题是出现在数组的定义上。我们一起找,没找到,最后上网查了一下才知道原来是我们数组定义的时候出了错!真的是有认真思考过才会印象深刻,因为我们在检查的过程中一遍又一遍的看我们写的代码,所以现在是比较熟悉,在被第一道题目困住,最后解决之后,第二道题目很快就做出来了。

 

猜你喜欢

转载自www.cnblogs.com/lincanji/p/9784633.html