第二章实验报告

第二章实验报告

20171003172 陈满

1. 

7-2 改写二分搜索算法 (20 分)

题目来源:《计算机算法设计与分析》,王晓东

设a[0:n-1]是已排好序的数组,请改写二分搜索算法,使得当x不在数组中时,返回小于x的最大元素位置i和大于x的最小元素位置j。当搜索元素在数组中时,i和j相同,均为x在数组中的位置。

输入格式:

输入有两行:

第一行是n值和x值; 第二行是n个不相同的整数组成的非降序序列,每个整数之间以空格分隔。

输出格式:

输出小于x的最大元素的最大下标i和大于x的最小元素的最小下标j。当搜索元素在数组中时,i和j相同。 提示:若x小于全部数值,则输出:-1 0 若x大于全部数值,则输出:n-1的值 n的值

2.问题描述:求x与这个数组中的元素的关系

3.算法描述:

#include<iostream>

using namespace std;

int BIN(int a[],int n,int key)

{

      int left=0;

      int right=n-1;

      int t=0;

     

  if(key>=a[0]&&key<=a[n-1]){

    while(left<=right)

      {

         int middle=(left+right)/2;

         t++;

         if(key==a[middle])

         {

               cout<<middle<<" "<<middle<<endl;

               return middle;

         }

         if(key>a[middle])   left=middle+1;

         else                right=middle-1;  

 

      }

     

         

     

            int j;

        for(j=1; j<n; j++)

        {

            if(key<a[j])

               break;

        }

       cout<<j-1<<" "<<j;

   

      }

      if(key<a[0])     cout<<-1<<" "<<0;

      if(key>a[n-1])   cout<<n-1<<" "<<n;

}

int main()

{

      int n,x;

      cin>>n>>x;

      int a[n];    

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

            cin>>a[i];

      BIN(a,n,x);

      return 0;

}

先判断元素是否在数组的区间内,然后采用二分查找判断x是否为数组内元素,是则输出middle middle;否则输出j-1,j;

然后判断x是小于数组全部元素还是大于数组全部元素

4.时间复杂度分搜索法充分利用了元素间的次序关系,采用分治策略,可在最坏情况下用O(logn)时间完成搜索任务。每执行一次while循环,待搜索数组的大小就减小一半。因此在最坏情况下,while循环被执行了O(logn)次。循环体内外运算需要O(1)的时间。因此整个算法在最坏情况下的时间复杂度为O(logn)。

  空间复杂度:二分搜索法的空间复杂度为O(1)。此算法的空间复杂度为一个常量,即不随被处理数据量n的大小而改变时,可表示为O(1)。

5.心得体会:

二分查找法更加快速便捷。

在做题过程中,样例的情况错误,后来发现是语句错了,其他没什么太大问题。

posted @ 2018-10-13 22:23  陈满  阅读(167)  评论(0编辑  收藏  举报