算法第二章上机实践报告

实践题目:

设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)

 

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

 

posted @ 2019-09-23 16:40  EMWWQ  阅读(144)  评论(0编辑  收藏  举报