给定一组长度为n的无序序列,将其存储在一维数组a[O..n-1]中。现采用如下方法找出其中的最大元素和最小元素:比较a[O]和a[n-1],若a[0]较大,则将二者的值进行交换;再比较a[1]和a[n-2],若a[1]较大,则交换二者的值;然后依次比较a[2]和a[n-3]、a[3]和a[n-4]、…,使得每一对元素中的较小者被交换到低下标端。重复上述方法,在数组的前n/2个元素中查找最小元素,

题目
给定一组长度为n的无序序列,将其存储在一维数组a[O..n-1]中。现采用如下方法找出其中的最大元素和最小元素:比较a[O]和a[n-1],若a[0]较大,则将二者的值进行交换;再比较a[1]和a[n-2],若a[1]较大,则交换二者的值;然后依次比较a[2]和a[n-3]、a[3]和a[n-4]、…,使得每一对元素中的较小者被交换到低下标端。重复上述方法,在数组的前n/2个元素中查找最小元素,在后n/2个元素查找最大元素,从而得到整个序列的最小元素和最大元素。上述方法采用的算法设计策略是( )。

A.动态规划法
B.贪心法
C.分治法
D.回溯法
参考答案和解析
答案:C
解析:
如果没有搜索结果或未解决您的问题,请直接 联系老师 获取答案。
相似问题和答案

第1题:

● 设有一个初始为空的栈,若输入序列为 1、2、3、…、n(n>3),且输出序列的第一个元素是 n-1,则输入序列中所有元素都出栈后,(37)。

(37)

A.元素 n-2 一定比n-3 先出栈

B.元素 1~n-2 在输出序列中的排列是不确定的

C.输出序列末尾的元素一定为 1

D.输出序列末尾的元素一定为 n


正确答案:A




 

第2题:

阅读以下说明和C语言函数,将应填入(n)处。

[说明]

函数int find_Max_Min(int a[],int n)的功能是:找出n个元素的数组a中的最大元素和最小元素并输出,返回查找过程中元素的比较次数。查找方法如下:比较a[0]和a[n-1],若a[0]大,则交换a[0]和a[n-1]的值:再比较a[1]和a[n-2],若a[1]大,则交换a[1]和a[n-2]的值;以此类推,直到所有的元素都比较完。然后在数组的前半区从前往后找出小元素,在后半区从后往前找出大元素。

[函数]

int find_Max_Min(int a[],int n)

{/*找出n个元素的数组a的最大、最小元素并输出,返回查找过程元素中的比较次数*/

int i,Count=0;

int temp,Maxnum,Minnum;

for(i=0; i<n/2; i++){

Count=Count+1 /*元素比较次数计数*/

if(a[i]>a[(1)])

{/*数组元素交换代码略*/}

}

Maxnum=a[n-1]; Minnum=a[0];

for(i=1;i<n/2+n%2;i++){

Count=(2); /*元素比较次数计数*/

Minnum=(3)? a[i]:Minnum; /*找最小元素*/

Maxnum=(4)?(5):Maxnum; /*找最大元素*/

}

printf("Max=%d\n",Maxnum);

printf("Min=%d\n",Minnum);

return Count;

}


正确答案:(1)n-i-1(2)Count+2(3)a[i]Minnum (4)a[n-i-1]>Maxnum(5)a[n-i-1]
(1)n-i-1(2)Count+2(3)a[i]Minnum (4)a[n-i-1]>Maxnum(5)a[n-i-1] 解析:本题考查编写C语言程序的基本知识。
先分析第一个for语句。
for(i=0; in/2; i++){
Count=Count+1;/*元素比较次数计数*/
if(a[i]>a[(1)])
{/*数组元素交换代码略*/)
}
根据函数int find_Max_Min(int a[],int n)的功能以及题于中描述的查找方法,可知经过第一个for循环后,数组a中的元素被分成了前半区(最小元素所在区域)和后半区 (最大元素所在区域)。由于元素a[0]与a[n-1]比较,a[1]与a[n-2]比较,由于i值随循环的变化规律是0,1,2,…,因此空(1)处应填入n-1-1。
再分析第二个for语句,此前先假设a[n-1]为最大元素Maxnum,a[0]为最小元素 Minnum。
for(i=1;in/2+n%2;i++){
Count=(2);/*元素比较次数计数*/
Minnum=(3)?a[i]:Minnum;/*找最小元素*/
Maxnum=(4)?(5):Maxnum; /*找最大元素*/
}
显然,同一个循环中在前半区查找最小元素,在后半区查找最大元素,元素比较次数计数器count的值随循环每次增加2。由于i值的变化规律为0,1,2,…,因此空(3)处填入“a[i]Minnum”,结合“? a[i]:Minnum” 表示找到更小元素a[i]时用a[i]更新 Minnum的值:同理,在后半区找到更大元素时更新Maxnum的值,题干中已经明确在后半区从后往前找出大元素,因此空(4)处应填入“a[n-I-1]>Maxnum”,空(5)处填入“a[n-i-1]”。

第3题:

对n个元素值分别为-1、0或1的整型数组A进行升序排序的算法描述如下:统计A中-1、0和1的个数,设分别为n1、n2和n3,然后将A中的前n1个元素赋值为-1,第n1+1到n1+n2个元素赋值为0,最后n3个元素赋值为1。该算法的时间复杂度和空间复杂度分别为()。

A.Θ(n)和Θ(1)

B.Θ(n)和Θ(n)

C.Θ(n2)和Θ(1)

D.Θ(n2)和Θ(n)


参考答案:A

本题需要用3个辅助变量n1、n2和n3来保存数组A中-1、0和1的个数,空间复杂度为Θ(1)。在统计时,需要使用一循环语句遍历数组A。统计完成后,再使用一次循环语句遍历数组A,并将A中的前n1个元素赋值为-1,第n1+1到n1+n2个元素赋值为0,最后n个元素赋值为1。数组A的元素个数为n,因此算法的时间复杂度为Θ(n)。

第4题:

阅读以下说明和流程图,回答问题将解答填入对应栏。

[说明]

本流程图实现采用递归函数来求一个整数数组中从元素0到元素n中的最小值。该算法思想是这样的,首先我们假设有一个求数组中最小元素的函数,然后,在求某一具有n的元素的数组的最小值时,只要求将前n-1的元素的最小值与第n个元素比较即可。不断地重复这一过程,直到数组中只剩下一个元素,那么它必定是最小值。

注:int min(int X,int y)为返回两数中最小数的函数。

int minInArray(int a[],int n)为返回数组中最小数的函数。

minA为数组中最小值。

[问题l]

将流程图的(1)~(4)处补充完整。

[问题2]

min()函数的定义为(5)。


正确答案:(1) minInArray(an); (2) 1; (3) minA=a[n-1]; (4) minA=min(minInArray(an-1)a[n]); (5) xy?x:y;
(1) minInArray(a,n); (2) 1; (3) minA=a[n-1]; (4) minA=min(minInArray(a,n-1),a[n]); (5) xy?x:y; 解析:本题目考查流程图。
题目是利用递归来求数组中的最小值,则一定是反复的调用一个求数组最小值的函数,直到比较数组中最后只剩下两个数,则(1)中填入的应是“minlnArray(a,n)”,然后,判断n的值是否为1,如果是,则说明数组中只有一个数,则它一定就是最小值,可以直接输出,所以(2)应填入“1”,(3)应填入“minA=a[n]”;如果n的值不是1,则说明要继续递归,则再次调用求数组最小值的函数,把数组前n-1项的最小值同第n项做比较,所以(4)填入“minA=min(minInArray(a,n-1),a[n])”,由于min()是一个比较函数,返回两数中较小的数,我们可以用三元运算符直接定义为x y?x:y。

第5题:

在一个长度为n的顺序线性表中顺序查找值为x的元素时,查找成功时的平均查找长度(即x与元素的平均比较次数,假定查找每个元素的概率都相等)为().

An

Bn/2

C(n+1)/2

D(n-1)/2


参考答案:C

第6题:

用数组A[0,N-1]存放循环队列的元素值,若其头指针和尾指针分别为front和rear,则循环队列中当前元素的个数为

A.(rear-front+N+1)mod N

B.(rear-front+1)mod N

C.(rear-front-1+N)mod N

D.(rear-front)mod N


正确答案:A

第7题:

● 两个递增序列 A和 B的长度分别为 m和 n(m<n) ,将二者归并为一个长度为 m+n的递增序列时, (42) ,归并过程中元素的比较次数最少。

(42)

A. 当 A的最大元素大于 B 的最大元素时

B. 当 A的最大元素小于 B 的最小元素时

C. 当 A的最小元素大于 B 的最小元素时

D. 当 A的最小元素小于 B 的最大元素时


正确答案:B

第8题:

有n个元素的数组,查找其中最大值的元素,一般需要()次元素的比较 。

A.1

B.n

C.n+1

D.n-1


参考答案:D

第9题:

阅读下列函数说明和C代码,将应填入(n)处的字句写在对应栏内。

【说明】

函数void rcr(int a[],int n,int k)的功能是:将数组a中的元素s[0]~9[n-1]循环向右平移k个位置。

为了达到总移动次数不超过n的要求,每个元素都必须只经过一次移动到达目标位置。在函数rcr中用如下算法实现:首先备份a[0]的值,然后计算应移动到a[0]的元素的下标 p,并将a[P]的值移至a[0];接着计算应移动到a[p]的元素的下标q,并将a[q]的值移至 a[p];依次类推,直到将a[0]的备份值移到正确位置。

若此时移动到位的元素个数已经为n,则结束;否则,再备份a[1]的值,然后计算应移动到a[1]的元素的下标p,并将a[p]的值移至9[1];接着计算应移动到a[p]的元素的下标q,并将a[q]的值移至a[p];依次类推,直到将a[1]的备份值移到正确位置。

若此时移动到位的元素个数已经为n,则结束;否则,从a[2]开始,重复上述过程,直至将所有的元素都移动到目标位置时为止。

例如,数组a中的6个元素如图1(a)所示,循环向右平移两个位置后元素的排列情况如图1(b)所示。

void rcr( int a[] ,int n,int k)

{ int i,j,t,temp,count;

count =0; /*记录移动元素的次数*/

k=k%n;

if((1)){ /*若k是n的倍数,则元素无须移动;否则,每个元素都要移动*/

i=0

while(count<n) {

j=i;t=i;

temp =a[1]; /*备份a[i]的值*/

/*移动相关元素,直到计算出a[i]应移动到的目标位置*/

while((j=(2))! =i){

a[t]=a[j];

t=(3);

count++;

}

(4)= temp;count ++;

(5);

}

}

}


正确答案:(1)k或k!=0 (2)(j-k+n)%n或(t-k+n)%n (3)j (4)a[t]或等价表达式 (5)i++或等价表达式
(1)k或k!=0 (2)(j-k+n)%n或(t-k+n)%n (3)j (4)a[t]或等价表达式 (5)i++或等价表达式 解析:(1)判断k执行k=k%n后是否为0,即是否是n的倍数,应填入k或k!=0。(2)j表示要移动到a[t]的元素的位置,于是j和t的关系为j=(t-k+n)%n;当执行完j=i,t=i后,j=t,于是此处可填入(j-k+n)%n或(t-k+n)%n。(3)将a[j]移动到a[t]后,需要将 t指向j,即此处填入j。(4)将暂存在temp中的值移动到a[t]中。即此处填入a[t]或等价表达式。(5)此处while循环的递增条件,显然应该是i++或其他等价表达式。

第10题:

设有一个初始为空的栈,若输入序列为1、2、3、…、n(n>3),且输出序列的第一个元素是n-1,则输入序列中所有元素都出栈后,( )。

A.元素n-2一定比n一3先出栈

B.元素1~n-2在输出序列中的排列是不确定的

C.输出序列末尾的元素一定为1

D.输出序列末尾的元素一定为n


正确答案:A
解析:栈的特点是先进后出。如果初始栈为空且输入序列为l、2、3、…、n,在1~n-1个元素依次进栈后,1~n在栈中的顺序为倒过来的,即1在栈底,n-—1在栈顶。这时有两种操作:n-1出栈或者n进栈。如果n-1出栈,接下来改变栈状态的动作为n进栈或者n-2出栈。如果是n进栈,这样在n出栈后,n-2、n-3、…、2、1才能依次出栈。依此类推,元素1~n-2的排序在输出序列的排序是确定的,为n-2、n-3、…、2、1,元素n-2一定比n-3先出栈。元素n则可以在序列n-2、n-3、…、2、1的任何一个位置上。

更多相关问题