算法第二章上机实验报告

一、实践题目

改写二分搜索算法

二、问题描述

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

三、算法描述

依然采用了二分搜索算法的大部分代码,然后进行了简单修改。

当x不在数组中时分为三种情况,需要对这三种情况进行一一实现。

#include <iostream>
using namespace std;
int main(){
 int n,x;
 cin >> n >> x;
 if(1<=n<=100){
  int a[n];
  for(int i=0;i<n;i++){
      cin >> a[i];
  }
  int i = 0;
  int j = n-1;
  int mid;
  if(x<a[0]){
      cout << "-1 " << "0" <<endl;
   return 0;
  }
  
     else if(x>a[n-1]) {
      cout << n-1 <<" "<<n<<endl;
      return 0;
  }
  else {
   while(i<=j){
   mid = (i+j)/2;
   if(x==a[mid]){
    cout << mid << " " << mid << endl;
       return 0;
   }
   else if(x < a[mid]){
       j = mid - 1;
   }
   else if(x > a[mid]){
     i =  mid+1;
   } 
     }
     cout << j <<" "<< i <<endl;
  }
 }
 return 0;
}

四、时间及空间复杂度分析

时间复杂度:采用了二分搜索算法的思想,所以时间复杂度为O(logn)。

空间复杂度:O(1)

五、心得体会

此算法是在二分搜索算法的基础上加以改进,改进的地方主要在于数组中无要搜索的数时输出它介于哪两个位置之间。所以要设i和j,当i和j的位置互换之后,证明没有查找到要查找的数,输出i和j的值。一开始的时候直接想在二分算法的代码上进行修改,但出现了一些错误,如当x存在于数组中时,虽然i和j相同但还是要两个输出两个数的值,由于对这一步骤没有修改出现了错误。在实现代码的过程中出现了许多小问题,但最后通过结对编程都一一解决了。

posted @ 2018-10-21 17:00  苌晓娜  阅读(205)  评论(0编辑  收藏  举报