第二章实践报告

1.实践题目

7-1 二分查找 

输入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.问题描述

要求设置一个长度为n的数组,输入数组并对它进行排序,然后利用二分查找某个数值x,查找成功则输出其所在位置及比较次数,否则输出-1及比较次数;另外,n的范围、输入格式及输出格式都有要求:0<=n<=1000;输入共三行: 第一行是n值; 第二行是n个整数; 第三行是x值。;查找成功则输出其所在位置及比较次数,否则输出-1及比较次数。

3.算法描述

假设现有数据是按升序排的,对于给定值x,从序列的中间位置开始比较,如果当前位置的值等于x,则查找成功;若x小于当前的值,则在数列前面的数据中查找;若x大于当前的值则在数列后面的数据中继续查找。

源代码:

//二分法查找

#include<iostream>
using namespace std;

int Binary(int a[], int x, int n) {
int left=0;
int right=n-1;
int t=0;
while(left<=right) {
int middle=(left+right)/2;
t++;
if (x==a[middle])
{
cout<<middle<<endl;
cout<<t<<endl;
return middle;
}
if (x>a[middle])left=middle + 1;
else
{
right=middle-1;
}

}
cout << "-1"<<endl;
cout <<t<<endl;
return -1;
}

int main() {
int n;
cin >> n;
int *p=new int [n];
for (int i=0;i<n;i++)
{
cin>>p[i];
}
int x;
cin>>x;
Binary(p,x,n);
}

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

时间复杂度:每次比较的都是(left+right)/2,然后进行l赋值给eft或者right,即二分操做,每次查找内容缩减一半,因此时间复杂度为O(logN)

 

5.心得体会(对本次实践收获及疑惑进行总结)

课堂上原本有3个题目的,可是整整的一堂课只做了1道题。我觉得我的问题主要有:①课前并没有回顾好知识,导致课堂上花了不少时间来回顾什么是二分法,还有实现的代码。②语法基础不过关,一直存在编译错误的问题,导致在修改语法上也花费不少时间。因此在之后的上机实验课我应该先回顾课堂上的内容,对代码实现有个大概了解,然后就是多练习多编程减少语法出错啦!

posted on 2018-10-14 17:01  岑志健  阅读(181)  评论(0编辑  收藏  举报