算法第二章上机实践报告

1.实践题目

7-1 二分查找

2.问题描述

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

3.算法描述

核心算法是二分查找,将已经排好的序列一分为二,划分的中心数定义为mid,然后将mid与要查找的数相比较,根据大小再将将其划分。

源代码:

#include <iostream>
using namespace std;
int s(int a[], int x, int n)
{
    int l=0, r=n-1, num=1;
    int mid;
    int p=0;
    while(l<=r)
    {
        mid=(l+r)/2;
        if(x==a[mid])
        {
            p=1;
            cout<<mid<<endl<<num;
            break;
        }
        else if(x>a[mid])
        {
            l=mid+1;
            num++;
        }
        else
        {
            r=mid-1;
            num++;
        }
    }
    if(p==0)
    {
    cout<<"-1"<<endl<<num-1;
    }
}
int main()
{
    int n,i,x;
    int a[1000];
    cin>>n;
    for(i=0;i<n;i++)
    {
        cin>>a[i];
    }
    cin>>x;
    s(a,x,n);
    return 0;
}
4.算法时间及空间复杂度分析

时间复杂度实际上就是while循环的次数,总共有n个元素,渐渐跟下去就是n,n/2,n/4,....n/2^k(k为循环次数),令n/2^k=1,可得k=log2n,则时间复杂度为O(n)=O(log2n)(以2为底,n的对数)。

5.心得体会

在大一学习c++的时候就已经初步了解过这种方法,现在对这种方法的使用可以说更加流畅。在使用中尤其要注意再次划分时的mid+1和mid-1,以免出错。

 

 

 

 
posted @ 2019-09-22 20:52  luferm  阅读(151)  评论(0编辑  收藏  举报