算法第二章作业实验报告

实验报告要求任选一题进行分析。内容包括:

  1. 实践题目
  2. 问题描述
  3. 算法描述
  4. 算法时间及空间复杂度分析(要有分析过程)
  5. 心得体会(对本次实践收获及疑惑进行总结)

本次实践一共三道题,我选择第一道题来分析。

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

2.问题描述:

简单来说就是在一个非降序的顺序表里找要查找的数据,输出下标和比较次数,方法规定使用二分法

二分查找的基本思想是将n个元素分成大致相等的两部分,取a[n/2]与x做比较,如果x=a[n/2],则找到x,算法中止。如果x< a[n/2],则只要在数组a的左半部分继续搜索x,如果x>a[n/2],则只要在数组a的右半部搜索x。一直这样搜索下去

3.算法描述

  3.1置查找区间初值,left为0,right为n-1

  3.2当left小于等于right时,循环执行一下操作:

  •   middle取值为left和right的中间值;
  •   循环次数记录数counter+1。
  •   将定值x与中间位置记录的关键字进行比较,若相等则查找成功,返回中间位置middle;
  •   若不相等则利用中间位置记录将表对分成前‚后两个子表。如果x比中间位置记录的关键字小,则left取为middle-1,否则right取为middle+1。

  3.3循环结束,说明查找区间为空,则查找失败,返回0.

扫描二维码关注公众号,回复: 7326784 查看本文章

代码描述:

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

4.算法时间及空间复杂度分析

时间复杂度:总共有n个元素,每次查找的区间大小就是n,n/2,n/4,…,n/2^k(接下来操作元素的剩余个数),其中k就是循环的次数。 由于n/2^k取整后>=1,即令n/2^k=1, 可得k=log2n,(是以2为底,n的对数),所以时间复杂度可以表示O()=O(logn)

空间复杂度:由于在一个数组内就可以完成所有工作,所以空间复杂度O(1)

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

收获是我更加熟悉了二分查找算法

还有一些代码的小细节需要注意:

  • 函数可以用没有返回值的函数,
  • 一些变量比如记录查找次数的变量的名称应该注意一下,计数类的最好用counter,布尔型的用flag

猜你喜欢

转载自www.cnblogs.com/miaobeilei/p/11564750.html