算法第二章上机实验报告

一、实践题目

改写二分搜索算法

二、问题描述

设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相同但还是要两个输出两个数的值,由于对这一步骤没有修改出现了错误。在实现代码的过程中出现了许多小问题,但最后通过结对编程都一一解决了。

转载于:https://www.cnblogs.com/cxna/p/9825680.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值