墨滴

算法第二章上机实验报告

引论:针对pinta上实践第二题的分析
一、 实践题目

设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的值
输入样例:
在这里给出一组输入。例如:
6 5
2 4 6 8 10 12
输出样例:
在这里给出相应的输出。例如:
1 2

二、 题目描述

在第一题的算法上进行小幅度的调整,让调度停止的条件变成右大于左,可以解决输出两个相邻数的问题,同时,也可以解决输出n,n-1的问题。

三、 算法描述

include

using namespace std;
int leftnum=0;
int rightnum=0;
int binarySearch(int num[],int left,int right,int mubiao)
{
int mid;
if(left>right)
{
leftnum = left;
rightnum = right;
return -1;
}//左大于右是临界条件
else
{
mid=(left+right)/2;
if(num[mid]==mubiao)
{
return mid;
}
else if(num[mid]!=mubiao)
{
if(mubiao>num[mid])//在右边
{
return binarySearch(num,mid+1,right,mubiao);
}
else return binarySearch(num,left,mid-1,mubiao);//在左边
}
}//递归调用过程
}

int main()
{
int num[1000];
int i,mubiao,n;
cin>>n;
cin>>mubiao;
for(i=0;i<n;i++)
{
cin>>num[i];
}//输入数组
int date = binarySearch(num,0,n-1,mubiao);
if(date == -1){
cout<<rightnum<<" "<<leftnum;
}//左右两边要交换输出
else
cout<<date<<" "<<date;

}

四、 算法已经时间复杂度的分析

O(log n),二分搜索

五、 心得体会

第一次上机实践速度较慢,对问题的了解不够深刻,希望在下次上机可以得到更大的几步

posted on 2019-09-25 20:36  墨滴  阅读(135)  评论(0编辑  收藏  举报

导航