算法第二章上机实践报告

7-1 二分查找

 

问题描述:

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

 

算法描述:

对有序数列进行二分查找。每一次取数列的中位数与目标数比较,如相等直接输出,若小于目标数,取中位数右半数列再进行比较,若大于,则取左半数列。期间,每比较一次,记录比较次数的变量加一。直到所剩数列没有元素为止。

 

#include<iostream>

using namespace std;

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

{

    int l=0, r=n-1,t=0;

    while(l<=r){

        int mid=(l+r)/2;

        if(a[mid]==x) { 

        t++;

        cout<< mid<<endl<<t;

        return 0;

        }

        else if(a[mid]<x) {

        l=mid+1;

        t++;

        }

        else {

        r=mid-1;

        t++;

        }

    }

cout<< "-1"<<endl<<t;

return 0;

}

 

 

int main()

{

    int n,i=1,t=0;

    cin>>n;

    int arry[n+1];

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

        cin>>arry[i];

    }

    int x;

    cin>>x;

    find(arry,x,n);

 }

 

时间即空间复杂度:

二分查找中,每比较一次,数列的长度就减小一半,while循环的时间复杂度是O(log n),循环内的运算需要O(1)的时间复杂度,所以整个算法时间复杂度是O(log n)

整个算法请求了一个int和一个int [n] 的空间,空间复杂度分别是O(1) 和O(n),所以最终空间复杂度是O(n)

 

心得:

在二分查找的基础上要求输出比较次数,虽看似简单,但是在每一次的递归调用中要记录好次数,注意输出和返回值,更要清楚递归调用的条件。在算法设计之外还要懂得分析,在分析中改进完善。

posted @ 2019-09-25 17:49  miamigo  阅读(117)  评论(0编辑  收藏  举报