算法第二章上机作业体会

一、实践题目———二分查找

 

二、问题描述

  输入n值(1<=n<=1000)、n个非降序排列的整数以及要查找的数x,使用二分查找算法查找x,输出x所在的下标(0~n-1)及比较次数。若x不存在,输出-1和比较次数。

输入格式:

输入共三行: 第一行是n值; 第二行是n个整数; 第三行是x值。

输出格式:

输出x所在的下标(0~n-1)及比较次数。若x不存在,输出-1和比较次数。

输入样例:

4
1 2 3 4
1

输出样例:

0
2

三、算法描述
主要是运用递推的方法,不断的折半查找x,如果查找不到x,devide_selsct将会返回-1;而查找次数,则交给全局变量i。
#include<iostream>
using namespace std;
int i = 0;
int devide_select(int a[], int x, int left, int right){
 if( left <= right){
     i++;
        int mid = (left + right) / 2 ;
        if( a[mid] == x ) return mid;
        if( a[mid] > x ) return devide_select( a, x, left, mid - 1);
        if( a[mid] < x ) return devide_select( a, x, mid + 1, right);
 }
 else return -1;
}
int main(){
    int n;
    cin >> n;
    int a[n];
    for(int i = 0; i < n; i++)
        cin >> a[i];
    int x;
    cin >> x;
    int x_sign = devide_select( a, x, 0, n-1);
    cout << x_sign << endl;
    cout << i;
}

四、算法时间及空间复杂度
1、时间复杂度
  由于是递归的二分搜索算法所以,devide_selsct的时间复杂度为O(log n),而循环输入的时间复杂度为O(n),再加上其他语句的时间复杂度O(1),则可得算法的时间复杂度为,上面的相加,即O(n)
2、空间复杂度
  这段代码里,向计算机请求的空间只有int和int[],他们的空间复杂度分别为O(1)和O(n),将他们相加即可得到算法的时间复杂度,即O(n)

五、心得体会
多写多练,方能提升自我。
posted @ 2019-09-25 17:13  Dantalian  阅读(144)  评论(0编辑  收藏  举报