算法第二章上机实践报告

一、实践题目———二分查找

 

二、问题描述

  输入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

三、算法描述
主要是运用递推的方法,不断的折半查找x,如果查找不到x,devide_selsct将会返回-1;而查找次数,则交给全局变量i。
#include<iostream>
using namespace std;
int i = 0;
int devide_select(int a[], int x, int left, int right){
 if( left <= right){
     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] < x ) return devide_select( a, x, mid + 1, right);
 }
 else return -1;
}
int main(){
    int n;
    cin >> n;
    int a[n];
    for(int i = 0; i < n; i++)
        cin >> a[i];
    int x;
    cin >> x;
    int x_sign = devide_select( a, x, 0, n-1);
    cout << x_sign << endl;
    cout << i;
}

四、算法时间及空间复杂度
1、时间复杂度
  由于是递归的二分搜索算法所以,devide_selsct的时间复杂度为O(log n),而循环输入的时间复杂度为O(n),再加上其他语句的时间复杂度O(1),则可得算法的时间复杂度为,上面的相加,即O(n)
2、空间复杂度
  这段代码里,向计算机请求的空间只有int和int[],他们的空间复杂度分别为O(1)和O(n),将他们相加即可得到算法的时间复杂度,即O(n)

五、心得体会
  本来刚开始做这个题的时候,笔者以为是一道挺简单的题(本来也是挺简单的),但是呢,做的途中,却遇到过许多问题。比如输出错误,笔者犯了2次,首先是输出的格式,格式搞错了许多次。但解决完这个后,输出的结果还是错误,笔者左思右想,最后发现出现在了递归的return上,递归的某些地方没有return,导致数据输出错误。还遇到过许多问题,因篇幅问题,笔者就不展开讨论。
  希望以笔者的例子来告诫大家,学算法还是要多学多试多练,你不试,不练,你永远不知道简单的算法里,你会犯多少错误。

posted on 2019-09-22 20:51  陈宇琪  阅读(168)  评论(0编辑  收藏  举报