1. 实践题目:7-1 二分查找
  2. 问题描述:输入n值(1<=n<=1000)、n个非降序排列的整数以及要查找的数x,使用二分查找算法查找x,输出x所在的下标(0~n-1)及比较次数。若x不存在,输出-1和比较次数。
  3. 算法描述:

首先把有n个元素的排好序的数组a分成两半,每次把第n/2个与要搜索的数x进行比较,如果相等,则比较成功。如果a[n/2]<x,则继续搜索数组的左半部分,如果a[n/2]>x,则搜索数组的右半部分,重复循环记录次数直到比较成功。如果在数组中找不到x元素,则返回-1.

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

{

    int l=0,r=n-1;

    while(l<=r)

    {

        int m=(l+r)/2;

        if(x==a[m]) cout<<m<<endl;

        if(x>a[m]) l=m+1;//继续在左半部分查找

        else r= m-1;//继续在右半部分查找

         p++;//p为比较次数

         if(x!=a[m]&&l>r) cout<<-1<<endl;//找不到时返回-1

    }



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

时间复杂度:每执行一次循环,数组长度减小一半,其中把数组分成一半的时间复杂度为O(1)

T(n) = O(1) + T(n/2)

T(n) = O(1) + logn

O(n) = logn

空间复杂度:O(1),辅助空间是常数级别的

  1. 心得体会(对本次实践收获及疑惑进行总结):
    (1)在本次实践中,体会到了在编写代码时,不仅仅要考虑功能的实现,且要对算法进行时间复杂度的分析,谨慎使用循环语句。

(2)还体会到了对程序的实践过程要有清晰的理解,如在题目中要考虑对比较次数的统计,如何快速分析以便做到减少语句的执行次数且结果准确,就需要对各种情况的输入程序执行的语句有清楚的认识。