算法第二章上机实践报告

1.实践题目

7-1 二分查找 (20 分)

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

2.问题描述
问题是让我们用二分查找法从建立的数组中查找我们要的数,并输出该数在数组中的下标以及查找该数的过程中通过二分查找法比较的次数。

3.算法描述
首先将数组a[n]分为两部分,并通过比较x与a[2/n]的大小判断,若刚好相等则输出a[2/n]的下标数以及比较次数1,算法终止。若x<a[2/n],则在数组左半部分进行比较,反之则在右半部分,直至查找到
输出下标数及查找次数,否则查找失败,返回结果-1。
#include<iostream>
using  namespace std;

int BIN(int a[], int key, int n) {
    int left = 0;
    int right = n - 1;
    int t = 0;
    while (left <= right) {
        int middle = (left + right) / 2;
        t++;
        if (key == a[middle])
        {
            cout << middle<<endl;
            cout << t; 
            return middle;
        }
        if (key > a[middle])left = middle + 1;
        else { right = middle - 1; }

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

int main() {
    int n;
    cin >> n;

    int *a = new int [n];
    for (int i = 0; i < n; i++)
    {
        cin >> a[i];
    }


    int x;

    cin >> x;


    BIN(a, x, n);

    //也可以cout<<BIN(a,x,n);

    system("pause");
}

4.算法空间及时间复杂度分析
每执行一次while循环,待搜索的数组大小减小一半,最好的时间复杂度是0(1),最坏是0(logn)

5.心得体会
本题的难度相对来说比较小,很适合我这样之前对方法掌握不够的人,同时在共同编程的过程钧彦同学也给了我很大的帮助,包括思路上的梳理以及代码上的纠正,总的来说,通过这一次实践,我对二分查找法以及分治法都有了更进一步的理解。
posted @ 2018-10-14 16:04  陈志文  阅读(136)  评论(0)    收藏  举报