算法第二章上机实验报告

1、实践题目:7-1 二分查找

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

3、算法描述:在给定元素排好顺序的前提下,用left表示最左边的数,以及用right表示最右边的数,用mid表示中间的数,如果最中间的数等于要找的数便直接输出下标;如果要找的数小于最中间的数,则mid=right;若要找的数大于最中间的数,则mid=left;不断的去进行这个循环最终可以得出所要找的x,从而输出它的下标。关于比较次数,则在二分查找的函数之前定义一个全局变量sum=0,且在循环里每进行一次便进行一次次数的累计。

4、源代码

#include "stdafx.h"
#include"iostream"
using namespace std;

int sum=0;
int binarySerach(int array[],const int&x, int n) {
    int left = 0;
    int right = n - 1;
    while (left <= right) {
        sum++;
        int mid = (left + right) / 2;
        if (array[mid] == x) {
            return mid;
        }
        else if (array[mid] < x) {
            left = mid + 1;
        }
        else {
            right = mid - 1;
        }
    }
    return -1;
}

int _tmain(int argc, _TCHAR* argv[])
{
    int a[200];int n,i,y,k;
    cin>>n;
    for(i=0;i<n;i++)
        cin>>a[i];
    cin>>k;
    y=binarySerach(a,k,n);
      cout<<y<<endl;
    cout<<sum<<endl;
    system("pause");
    return 0;
}

5、算法时间与空间复杂度:每进行一次while循环,待搜索数组大小减小一半,因此在最坏的情况下,while循环被执行了O(logn)次,所以算法在最坏情况下计算的时间复杂性为O(logn).

6、心得体会:关于全局变量跟局部变量使用方法有些模糊,关于c++的某些知识已经遗忘,课后应该抓紧时间复习一下以前的知识。

posted @ 2018-10-15 20:30  YILINNN  阅读(224)  评论(0编辑  收藏  举报