确定n个不同数的数组S和正整数i,,求S中最大的i个数,并且按照从小到大的次序输出。有下述算法: 算法A:调用i次找最大算法Findmax每次从S中删除一个最大的数。 算法B:对S排序,并输出S中最大的i个数。 (1)分析A,B两个算法在最坏情况下的时间复杂度。 (2)试设计一个最坏情况下时间复杂度的阶更低的算法,要求给出伪码。
第1题
给定n个不同数的数组S和正整数i,,求S中最大的i个数,并且按照从大到小的次序输出,现有如下算法, 算法:调用i次找最大算法Findmax,每次从S中删除一个最大的数。该算法在最坏情况下的时间复杂度是:
A、
B、
C、
D、
E、
第2题
给定n个不同数的数组S和正整数i,,求S中最大的i个数,并且按照从大到小的次序输出,现有如下算法, 算法:对S排序,并输出S中最大的i个数。该算法在最坏情况下的时间复杂度是:
A、n
B、nlogn
C、logn
D、loglogn
E、
第3题
函数void convelt(chal *a,int n)是用递归方法将一个正整数n按逆序存放到一个字符数组a中,例如,n=123,在a中的存放为'3'、'2'、'1'。
[C函数1]
void convert(char *a,int n)
{ int i;
if((i=n/10)!=0; convert( (1) ,i);
*a= (2) ;
}
[说明2]
函数int index(char *s,char *t)检查字符串s中是否包含字符串t,若包含,则返回t在s中的开始位置(下标值),否则返回-1。
[C函数2]
int index(char *s,char *t)
{ int i,j=0;k=0;
for(i=0;s[i]!:'\0';i++)
( for( (3) ;(t[k]!='\0')&&(s[j]!='\0')&&( (4) );j++,k++);
if( (5) ) return(i);
}
return(-1);
}
第4题
[说明]
已知递推数列:a(1)=1,a (2s)= a (s),a(2s+1)=a (s)+a (s+1)(s 为正整数)。试求该数列的第n项与前n项中哪些项最大?最大值为多少?
算法分析:该数列序号分为奇数或偶数两种情况做不同递推,所得数列呈大小有规律的摆动。设置a数组,赋初值a (1)=1。根据递推式,在循环中分项序号s (2~n)为奇数或偶数作不同递推:每得一项 a (s),即与最大值max 作比较,如果a (s)>max,则max=a(i)。最后,在所有项中搜索最大项(因最大项可能多于一项),并打印最大值max。
[问题]
将流程图中的(1)~(5)处补充完整。
注:流程图中(1)循环开始的说明按照“循环变量名:循环初值,循环终值,增量”格式描述。
[流程图]
第5题
【流程图】注:循环开始框内应给出循环控制变量的初值和终值,默认递增值为1,格式为:循环控制变量=初值,终值
第6题
第7题
算法设计:对于给定的开区间集合I和正整数k,计算开区间集合I的最长k可重区间集的长度.
数据输入:由文件input.txt提供输入数据.文件的第1行有2个正整数n和k,分别表示开区间的个数和开区间的可重叠数.接下来的n行,每行有2个整数,表示开区间的左、右端点坐标.
结果输出:将计算的最长k可重区间集的长度输出到文件output.txt.
第8题
对于任何开线段z,设其端点坐标为(x0,y0)和(x1,y1),则开线段z的长度定义为
算法设计:对于给定的开线段集合I和正整数k.计算开线段集合I的最长k可重线段集的长度.
数据输入:由文件input.txt提供输入数据.文件的第1行有2个正整数n和k,分别表示开线段的个数和开线段的可重叠数.接下来的n行,每行有4个整数,表示开线段的2个端点坐标.
结果输出:将计算的最长k可重线段集的长度输出到文件output.txt.
第9题
floatfun(floata[],intn)
{
intifloats
for(i=0,s=0i
return(s/n)
}
A.求数组a的最大值
B.求数组a的最小值
C.求数组a的总值
D.求数组a的平均值
第10题
下面程序中函数fun的功能是:在含有10 个元素的s数组中查找最大数,及最大数所在位置(即,下标值),最大数可能不止一个。最大数作为函数值返回,最大数的个数通过指针变量n传回,所在位置由数组pos传回。
例如:
若输入 2 8 5 7 8 4 5 3 2 8
则应输出:
The max: 8
Total: 3 //最大数出现次数
The positions: 1 4 9
请补充下列空缺:
include<stdio.h>
include<conio.h>
define M 10
int fun(int *a, int *n, int pos[])
{int i, k,max=-32767;
(1)
for(i=0; i<M; i++)
if( (2) ) max=a[i];
for(i=0; i<M; i++)
if( (3) )pos[k++]=i;
*n=k;
return max;
}
main()
{int a[M], pos[M], i=0, j, n;
clrscr();
printf("Enter 10 number :");
for(i=0; i<M; i++)scanf("%d", (4));
j=fun( (5) );
printf("The max: %d\n", j);
printf("Total: %d",n);
printf("The position:");
for(i=0; i<n; i++ ) printf("%4d", pos[i]);
printf("\n");
}
为了保护您的账号安全,请在“上学吧”公众号进行验证,点击“官网服务”-“账号验证”后输入验证码“”完成验证,验证成功后方可继续查看答案!