算法第二章上机实践报告

1.实践题目:7-2 改写二分搜索算法

2.问题描述:设a[0:n-1]是已排好序的数组,请改写二分搜索算法,使得当x不在数组中时,返回小于x的最大元素位置i和大于x的最小元素位置j。当搜索元素在数组中时,i和j相同,均为x在数组中的位置。

3.算法描述:

#include<iostream>
using  namespace std;

int Seek(int a[], int b, int n)
{
    int left = 0;
    int right = n - 1;
    int i = 0;
    int j = 0;
    while (left <= right) {
        int middle = (left + right) / 2;
        if (b == a[middle]){
            i = j = middle;
            cout << i <<" "<<j;
            return middle;
        }
        if (b > 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];
    }
    Seek(a, x, n);
}

 

 

4.算法时间及空间复杂度分析:二分法通过执行while循环,不断地将问题的规模减小一半,所以为O(logn),空间复杂度为o(1)

5.心得体会:因为题型上其实跟第一题差不多,所以也没有多大问题,直接粘贴复制了一部分,并根据其要求进行了一些修改。

posted @ 2018-10-21 22:20  Psyche6  阅读(101)  评论(0)    收藏  举报