算法第二章上机实践报告

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

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

输入格式:

输入有两行:

第一行是n值和x值; 第二行是n个不相同的整数组成的非降序序列,每个整数之间以空格分隔。

输出格式:

输出小于x的最大元素的最大下标i和大于x的最小元素的最小下标j。当搜索元素在数组中时,i和j相同。 提示:若x小于全部数值,则输出:-1 0 若x大于全部数值,则输出:n-1的值 n的值

代码:
#include <iostream>
using namespace std;

int bisearch(int* a, int x, int l, int r) {
    if(l > r) 
    {

        cout<<r<<" "<<l;
        return 0;
    }   
    else
    {
        int mid = (l+r) / 2;
        if (x == a[mid]) 
        {
            cout<<mid<<" "<<mid;
            return 0;
        }   
         
        if (x < a[mid])
            bisearch(a, x, l, mid-1);           
        else
            bisearch(a, x, mid+1, r);

    }
}
int main() {
    int a[1001];
    int n, x;
    cin >> n;
    cin >> x;
    for(int i = 0; i < n; i++) 
     cin >> a[i];
    bisearch(a ,x, 0, n-1);
    return 0;
    
}
View Code

算法描述改写二分算法的输出部分,结合递归算法,输出中位数。

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

①比较,赋值:4O(1)

②递归:T(n/2)

T(n) = 4 + T(n/2)

= 4 + 4 + T(n/4)

= ...

=O(log2n)

心得体会

1.这次实践题目是根据二分查找进行改编,解决不同问题,让人感受到算法的强大魅力。

2.这次将循环结构while与递归比较if...else...搞混,程序的开销增多。结队打代码能发现自己所打代码出现的问题,也能学到很多自己所不知道的知识。

posted @ 2019-09-23 16:17  咖啡yuan  阅读(176)  评论(0编辑  收藏  举报