• 算法第二章上机实践报告


    实践题目: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...搞混,程序的开销增多。结队打代码能发现自己所打代码出现的问题,也能学到很多自己所不知道的知识。

  • 相关阅读:
    前端模板Nunjucks简介
    git提交时支持文件名大小写的修改
    多行文本加省略号的处理方法
    前端性能优化实践方案总结
    使用gulp工具生成svgsprites
    koa简介
    JSX语法简介
    踩坑所引发出的appendChild方法的介绍
    React业务实践
    javascript--数组
  • 原文地址:https://www.cnblogs.com/liuyuany/p/11572953.html
Copyright © 2020-2023  润新知