标签:cout namespace space div iostream == 开始 组成 总结
实践报告任选一题进行分析。内容包括:
1.实践题目
题目来源:《计算机算法设计与分析》,王晓东
设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
2.问题描述
通过改写二分搜索算法,若x在数组中,给出下标,当x不在数组中时,给出小于x的最大元素的下标以及大于x的最小元素的下标
3.算法描述
在二分搜索算法的基础之上,如果x在数组中,输出x在数组中对应的下标两次;如果x不在数组中,最终right的值就是小于x的最大元素的下标,最终left的值就是大于x的最小元素的下标。
#include<iostream>
using namespace std;
int middle;
int bs(int a[],int x,int n)
{
int left = 0;int right = n-1;
while(left<=right){
middle = (left+right)/2;
if(x == a[middle]) cout<<middle<<‘ ‘<<middle;
if(x > a[middle]) left = middle + 1;
else right = middle - 1;
}
return right;
}
int main()
{
int n = 1000;
cin>>n;
int a[n];
int x;
cin>>x;
for(int i = 0;i<n;i++)
cin>>a[i];
int j = bs(a,x,n);
if(x != a[middle]) cout<<j<<‘ ‘<<j+1;
return 0;
}
4.算法时间及空间复杂度分析(要有分析过程)
算法在最坏的情况下while循环体会被执行O(log n)次,执行一次循环体需要O(1)时间,所以在最坏的情况下,时间复杂度为O(log n)。需要的辅助存储空间就是left, right, middle对应的存储空间,所以该算法的空间复杂度为O(1)。
5.心得体会(对本次实践收获及疑惑进行总结)
刚开始一直没有找到规律以为会分多种情况,后来才发现原来最后right和left的值就是要找到的下标值。当x就在数组中时,要输出两次下标值,否则在pta上会部分错误。通过这道题目,对二分搜索中while循环的步骤更清楚了,因为在找到规律的过程中要一次次在纸上执行while循环,确定right, left, middle的变化。
标签:cout namespace space div iostream == 开始 组成 总结
原文地址:https://www.cnblogs.com/lindsey-17/p/9785931.html