算法第二章上机实践报告

1.实践题目

改写二分搜索算法

2.问题描述

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

3.算法描述

在二分搜索算法的基础上进行小部分的修改。题目要求我们将一个数字插入到数组中,若数组中存在这个数字,则在进行判断后不需要对数组做修改;若不在其中,则根据其数字大小判断出可插入的相应位置。在二分搜索中,是给已经排好序的n个元素a[0;n-1]中找出特定元素,取大致的2/n个数字作比较,进行查找。此代码在设置好left、right两个指针后,当left<=right时进行二分查找,数字在数组中,对其位置进行判断;当left>right时,则跳过while循环,此时如果数字在数组中,则找出其left、right数组下标并把数字插入到正确位置,若数字不在数组中,则对left或right任一指针进行比较(此代码中是right指针),进行判断后找出数字位置。

 

详细代码:

#include<iostream>
using  namespace std;
int BIN(int a[], int key, int n) {
    int left = 0;
    int right = n - 1;

    int i = 0;
    int j = 0;
    while (left <= right) {
        int middle = (left + right) / 2;

        if (key == a[middle])
        {
            i = j = middle;
            cout << i <<" "<<j<<endl;
            return middle;
        }
        if (key > a[middle])left = middle + 1;
        else { right = middle - 1; }

    }
     i = right;
     j = left;
    cout << i<<" "<< j<<endl;

    return -1;
}

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

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


    BIN(a, x, n);

}

4.算法时间及空间复杂度分析

时间复杂度:每执行一次while循环,待搜索的数组的大小减小为原先的1/2,所以对于含有n个数字的数组来说,n=2的k次方,即k=log n,T(n)=T(n/2)+O(1)=T(n/4)+

O(1)+O(1)=O(log n)

空间复杂度:采用非递归方法的二分搜索法,仅仅用几个单变量就够了,空间复杂度为O(1)

5.心得体会

在有了第一题二分搜索算法的基础上,我们对此算法的应用更加了解了,所以第二题整体思路就比较清晰。由于我的动手能力较差,所以在同伴打代码的时候就在认真观看、学习,接下来的时间需要付出加倍的时间提高自己的动手实践能力。

posted @ 2018-10-21 21:26  imweili  阅读(189)  评论(0编辑  收藏  举报