zoukankan      html  css  js  c++  java
  • 算法第二章上机实践报告

    实践题目:

    设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的值

    问题描述:

    这道题除了用二分搜索找出数组中的数输出其下标,还需要考虑当x不在数组中的情况,输出其相邻的下标。

    算法描述:采用二分搜索算法。检索x是否在数组中,使用递归调用,若目标数大于中位数递归右半部分,小于中位数则递归左半部分。接着判断x是否在数组中,若在,则输出两次其坐标,不在则输出其相邻的下标。

    #include<iostream>
    using namespace std;

    int t = 0;

    int binarySearch(int a[],int x,int low,int high) {
        if(low > high) {
            return low;
        }
        t++;
        int mid = (low + high)/2;
        if(a[mid] == x) {
            return mid;
        };
        if(a[mid] > x) {
            return binarySearch(a, x, low, mid-1);
        }
        else{
            return binarySearch(a, x, mid+1, high);
        }
    }

    int main() {
        int n;
        int a[1000];
        int x;
        int index;
        int left = 0;
        cin >> n >> x;
        for(int i = 0; i < n; i++) {
            cin >> a[i];
        };
        index = binarySearch(a, x, 0, n-1);
        if(a[index] != x) {
            cout << index-1 <<" "<< index <<endl;
        }
    else{
            cout << index << " " << index << endl;
        }
    }

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

    在二分搜索算法中,不断递归直至找到为止。每次递归就是n/2。所以时间复杂度为O(logn)

    空间复杂度为O(n)

    心得体会:在做题前要有一个指导思想。首先要熟悉掌握书上的代码,通过其核心的思路解决不一样的问题。有时要精简自己的代码,不然会显得繁琐,可读性也会下降。全面思考一道题,需要考虑多种情况,善于运用判断语句。在小组合作的过程中,两个人的交流能够更有效率完成题目。思路的不同有时会促进思考,在讨论的过程中收获了知识,也看到自己的不足。

  • 相关阅读:
    Linux内核架构读书笔记
    Linux内核container_of 宏
    Linux内核架构读书笔记
    Linux内核架构读书笔记
    Linux内核架构读书笔记
    Linux内核架构读书笔记- 2.4.1 进程复制
    作业07:字符串索引与切片
    作业06:数字类型
    作业04:逻辑运算
    作业05:用户登录(三次机会)且每次输入错误显示剩余次数
  • 原文地址:https://www.cnblogs.com/yehaolin/p/11573140.html
Copyright © 2011-2022 走看看