●试题一阅读以下算法说明和流程图,回答问题1和问题2。【算法说明】下面是一段插入排序的程序,将R[k+1]插入到R[1…k]的适当位置。R[0]=R[k+1];j=k;while (R[j]>R[0]){R[j+1]=R[j];j--;}R[j+1]=R[0];【流程图】【测试用例设计】(while循环次数为0、1、2次)【问题1】指出算法的流程图中 (1) ~ (3) 处的内容。【问题2】指出测试用例设计中 (4) ~ (9) 处的内容。

题目

●试题一

阅读以下算法说明和流程图,回答问题1和问题2。

【算法说明】

下面是一段插入排序的程序,将R[k+1]插入到R[1…k]的适当位置。R[0]=R[k+1];j=k;

while (R[j]>R[0])

{

R[j+1]=R[j];j--;

}

R[j+1]=R[0];

【流程图】

【测试用例设计】

(while循环次数为0、1、2次)

【问题1】

指出算法的流程图中 (1) ~ (3) 处的内容。

【问题2】

指出测试用例设计中 (4) ~ (9) 处的内容。


相似考题
参考答案和解析
正确答案:
●试题一[问题1]【答案】(1)F(2)R[j+1]=R[0]〓(3)T[问题2]【答案】(4)①③(5)①②②③(6)①②②③(7)><(8)1(9)3【解析】本题考查用路径覆盖方法为算法设计足够的测试用例,属于基本概念的送分题。这类题拿分的关键是考生平时对于理论的理解和临场的细心。
更多“ ●试题一阅读以下算法说明和流程图,回答问题1和问题2。【算法说明】下面是一段插入排序的程序,将R[k+1]插入到R[1…k]的适当位置。R[0]=R[k+1];j=k;while (R[j]R[0]){R[j”相关问题
  • 第1题:

    () 下面是一趟插入排序的程序, 把R[i+1]插入到R[1..i]的适当位置 R[0] = R[i + 1]; j = i; while ( R[j] >R[0] ) { R[j + 1] = R[j]; j = j - 1; } R[j + 1] = R[0];问题:(15分) 请用路径覆盖方法为它设计足够的测试用例(while循环次数为0次、1次、2次)。

  • 第2题:

    在查看后台配置的Iub口对接关系时,可以通过探针查看哪个探针表格来查看配置的J0,J1和J2参数()。

    A.R_SDHTRIPARA

    B.R_SDHOPTPARA

    C.R_SDTB

    D.R_SDH


    参考答案:A, B

  • 第3题:

    以下程序的输出结果是_______。 main() {union { char i[2]; int k; }r; r.i[0]=2; r.i[1]=0; printf("%d\n",r.k); }

    A.2

    B.1

    C.0

    D.不确定


    正确答案:A
    解析:根据共用体的定义可知:共用体r的成员k和成员i[2]是共用同—段内存空间,所以,当程序给r.i[0]赋值后,实际上,共用体成员k的值也确定了,为2。所以打印输出的结果应当为2。

  • 第4题:

    阅读以下说明和C语言函数,将应填入(n)处的字句写在答题纸的对应栏内。

    【说明】

    假设一个剧场有N*N个座位,顾客买票时可以提出任意有效的座号请求。下面用二维数组a[N][N]模拟剧场中的座位,a[i][j]圆等于0表示

    第i排第j列(0≤i,j≤N-1)的票尚未售出。

    函数int Find(int a[][N],int R,int*row,int*col)的功能是:在部分票已售出的情况下,找出剧场中的R*R个空座位,要求这些座位

    的排列形成一个正方形。若找到满足要求的一个座位排列,则函数返回1,并算出该正方形左上角的行、列号;若未找到,则返回0。

    例如,一个7X7个座位的剧场如下图(a)所示,已售出部分座位的剧场如下图(b)所示,图中阴影部分表示已售出的座位,从下图(b)中找出

    的3X3正方形空座位如下图(c)中斜线区所示。

    【函数】

    int Find(int a[][N] int R,int*row,iht*col)

    {int i,j,k,c,t;int FOUND=0;

    for(i=0;!FOUND&&i<N-R+1;i++) { /*从第0排开始查找*/

    (1);

    while (j<N-R+1&&!FOUND) {

    for (k=0;(2)&&a[i][j+k]==0;k++); /*查找第i排连续的R个空座位*/

    if (k>=R) { /*找到第i排连续的R个空座位*/

    for (c=0;c<R;c++) { /*查找其余的R*(R-1)个座位*/

    for (t=1;t<R;t++)

    if (a[(3)][j+c]!=0) break;

    if (t<R) break;

    }/*for*/

    if ((4)) FOUND=1;

    }/*if*/

    (5;

    }/*while*/

    }/*fori*/

    if (FOUND) {

    *row=i-1; *col=j-1; /*计算正方形区域的左上角坐标*/

    return 1;

    }

    return 0;

    }


    正确答案:(1)j=0 (2)kR及其等价形式 (3)i+t (4)c>=R及其等价形式 (5)j++或++j或j+=1或j=j+1
    (1)j=0 (2)kR,及其等价形式 (3)i+t (4)c>=R,及其等价形式 (5)j++,或++j,或j+=1,或j=j+1 解析:首先将函数代码加上行号,以便说明。
    1:int Find (int a[][N],int R,int*row,int*col)
    2:{int i,j,k,c,t;int FOUND=0;
    3:for (i=0;!FOUND &&iN-R+1;i++){/*从第0排开始查找*/
    4:(1);
    5:while (jN-R+I&&!FOUND){
    6: for(k=0;(2)&&a[i][j+k]=0;k++);/*查找第i排连续的R个空座位*/.
    7:if(k>=R){/*找到第i排连续的R个空座位*/
    8: for (c=0;cR;c++){/*查找其余的R*(R-1)个座位*/
    9: for (t=1;tR;t++)
    10:if (a[(3)][j+c]!=0)break;
    11:if(tR)break;
    12:}/*for*/
    13:if ((4)) FOUND=1
    14:)/*if*/
    15: (5);
    16:}/*while*/
    17:)/*fori*/
    18cif (FOUND){
    19:*row=i-1;*col=j-1;/*计算正力形区域的左上角坐标*/
    20: return 1
    21:}
    22:return 0;
    23: }
    根据题目中的说明可知,函数Find()的计算过程就是在有标记的方阵中找出一个 R*R的尚未标记的子方阵。根据第3行的代码及注释“从第

    0排开始查找”,可知i起行号计数作用。
    在确定的起始行上,显然是从左到右找到一个空座位(即标记为0的矩阵元素),然后考查是否存在连续的R个空座位,若不存在,本行不再

    作为起始行,否则应考查与本行的连续R个空座位同列的下一行空座位情况,且从“a[i][j+k]==0”可知j起列号计数作用。因此,空(1)处应对

    j赋初值0,空(2)处的条件应保证元素a[i][j+k]的下标有效,即j+kN,又知j=N-R,所以空(2)处应填入“kR”。
    显然,一旦确定了第i行的R个空座位,随后就应考查第i+1行~第i+R-1行上的座位情况,这部分功能是由第8行~第12行代码来实现的。由

    于循环变量c的变化范围是0~R-1,t的变化范围是1~R-1,而且以j+c作为列下标,因此空(3).处的行下标应该为“i+t”。第11行代码表示的

    是循环for(c:0=;cR;c++)的中断处理,显然若该循环能在c==R时结束,则说明找到了R*R子方阵,因此空(4)处填入“c=R”。起列号计数

    作用的j在条件为“jN-R+1”的while循环中还需要有改变值的语句,因此空(5)处应填入“j++”。

  • 第5题:

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

    [说明]

    下面的流程图采用欧几里得算法,实现了计算两正整数最大公约数的功能。给定正整数m和 n,假定m大于等于n,算法的主要步骤为:

    (1)以n除m并令r为所得的余数;

    (2)若r等于0,算法结束;n即为所求;

    (3)将n和r分别赋给m和n,返回步骤(1)。

    [流程图]

    [问题1] 将流程图中的(1)~(4)处补充完整。

    [问题2] 若输入的m和n分别为27和21,则A中循环体被执行的次数是(5)。


    正确答案:[问题1] (1) n>m或nm或其它等效形式 (2) m←t (3) n←r (4) m%n [问题2] (5) 1
    [问题1] (1) n>m或nm或其它等效形式 (2) m←t (3) n←r (4) m%n [问题2] (5) 1 解析:(1)~(2)当n的值大于(等于)m时,应交换两者的值,再使用欧几里得算法;
    (3)~(4)略;
    (5)m,n和r在执行循环A前后的值分别为:

  • 第6题:


    A.R=0.24kj/(kg·K)
    B.R=240kJ/(kg·K)
    C.R=8314.4J/(kmol·K)
    D.R=240J/(kmol·K)

    答案:A
    解析:
    理想气体的比定压热容cp、比定容热容cv与气体常数R之间的关系为cp-cv=R。

  • 第7题:

    若I.、J、K、R同时在一个程序段中出现,则R有效,I、J、K被忽略。


    正确答案:正确

  • 第8题:

    完成下列折半插入排序算法。 Void binasort(struct node r[MAXSIZE],int n) {for(i=2;i<=n;i++){ r[0]=r[i];low=1;high=i-1; while(low<=high){ mid=(low+high)/2; if(r[0].key else low=mid+1 ; } for(j=i-1;j>=low;j- -)r[j+1]=r[j] ; r[low]=() ; } }


    正确答案:r[0]

  • 第9题:

    在查看后台配置的Iub口对接关系时,可以通过探针查看哪个探针表格来查看配置的J0,J1和J2参数()。

    • A、R_SDHTRIPARA
    • B、R_SDHOPTPARA
    • C、R_SDTB
    • D、R_SDH

    正确答案:A,B

  • 第10题:

    单选题
    对位于关键路线上的工序,下列说法正确的是:()。
    A

    工序单时差r(i,j)=0,工序总时差R(i,j)=0

    B

    工序单时差r(i,j)>0,工序总时差R(i,j)=0

    C

    工序单时差r(i,j)=0,工序总时差R(i,j)>0

    D

    工序单时差r(i,j)>0,则工序总时差R(i,j)>0


    正确答案: B
    解析: 暂无解析

  • 第11题:

    单选题
    阅读下列程序,回答问题: LDR R0, 0x22 LDR R1, 0x11 SUB R0, R0, R1 CMP R0, R1 执行上述程序后,CPSR的下列哪个标志位将发生变化()
    A

     C

    B

     V

    C

     Z

    D

     以上都不对


    正确答案: A
    解析: 暂无解析

  • 第12题:

    填空题
    完成下列折半插入排序算法。 Void binasort(struct node r[MAXSIZE],int n) {for(i=2;i else low=mid+1 ; } for(j=i-1;j>=low;j- -)r[j+1]=r[j] ; r[low]=() ; } }

    正确答案: r[0]
    解析: 暂无解析

  • 第13题:

    阅读下列算法说明和算法,将应填入(n)处的语句写在对应栏内。

    【说明】

    为了减少直接插入排序关键字的比较次数,本算法使用了二分(折半)插入法对一个无序数组R[1..n]进行排序。排序思想是对一个待插入元素,先通过二分法(折半)找到插入位置,后移元素后将该元素插入到恰当位置。(假设R[]中的元素互不相同)

    [算法]

    1.变量声明

    X: Data Type

    i,j,low, high,mid,r:0..n

    2.每循环一次插入一个R[i]

    循环:i以1为步长,从2到n,反复执行。

    (1)准备

    X←R[i];(1); high←i-1;

    (2)找插入位置

    循环:当(2)时,反复执行。

    (3)

    若X.key<R[mid].key

    则high←mid-1;

    否则 (4)

    (3)后移

    循环:j以-1为步长,从(5),反复执行。

    R[j+1]←R[j]

    (4)插入

    R[low]←X

    3.算法结束


    正确答案:(1)low←1 (2)low=high (3)mid←int((low+high)/2) (4)low←mid+1 (5)i-1到low
    (1)low←1 (2)low=high (3)mid←int((low+high)/2) (4)low←mid+1 (5)i-1到low 解析: 本题考查使用二分插入法对无序数组排序的伪码实现。
    在做题前,我们需要先大概明白二分插入法的基本思想和步骤,其基本思想是(设 R[low,…,high]是当前的插入区间):
    (1)将要插入的数取出放在X中;
    (2)确定区间的中点位置:mid=[(low+high)/2];
    (3)确定插入位置,将待插入的k值与R[mid].key比较,具体方法如下:
    ·若R[mid].key>k,则由排序后表的有序性可知R[mid,…,n].key均大于k,因此,插入区间是左子表R[low,…,high],其中high=mid-1。
    ·若R[mid].keyk,则要插入的k必在mid的右子表R[mid+1,…,high]中,其中 low=mid+1。
    (4)在上面的过程中,low逐步增加,而high逐步减少,直到highlow,则找到插入位置为low,然后循环移动位置low后面的元素,再插入数值。
    (5)重复上述过程,直到所有数都被插入。
    有了上面的分析,我们再来看程序伪代码,第(1)空处在准备阶段,准备阶段要完成的任务是给变量赋初值,high←i-1将数组中的最后一个位置赋给了插入指针high,因为插入的范围是数组的整个范围,那么第(1)空应该用来将数组的第一个位置赋给插入指针low,因此答案为low←1。
    第(2)空是找插入位置用的循环条件,根据我们上面的分析,要直到highlow时,才能确定插入的位置;而在low=high时,循环一直执行,结合程序的内容,知道此空答案为low=high。
    第(3)空很明显是用来确定区间的中间位置,但mid有可能为小数,在程序中我们用取整的方法来去掉小数部分,因此,此空答案为mid-int((low+high)/2)。
    第(4)空是条件X.keyR[mid].key不成立的情况下执行的语句,如果条件为假,则说明要插入的数大于中间位置的数,应该在其右区间里进行插入,根据分析知道,这时左指针low应该改变,这个空就是用来实现这个功能的,因此,答案为low←mid+1。
    第(5)空在后移的循环操作中,作为后移的循环判断条件,在找到插入位置后,进行插入前,我们需要一个空间来存放插入的值。从程序中不难看出,是将待插入位置后面的所有元素向后移动一位,而待插入位置存放在low中,因此,此空答案为i-1到 low。

  • 第14题:

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

    【说明2.1】

    以下C语言函数用二分插入法实现对整型数组a中n个数的排序功能。

    【函数2.1】

    void fun1 (int a[])

    { int i,j,k,r,x,m;

    for(i=2;i<=n;i++)

    { (1);

    k=1;r=i-1;

    while(k<=r)

    { m=(k+r)/2;

    if(x<a[m])r=m-1;

    else (2);

    }

    for(j=i-1;j>=k;j--)

    a[j+l]=a[j];

    (3);

    }

    }

    【说明2.2】

    以下程序可以把从键盘上输入的十进制数(long型)以二~十六进制形式输出。

    【程序2.2】

    include<stdio.h>

    main()

    { charb[16]={'0','l','2','3 ,4,'5','6','7','8','9','A','B','C','D','E','F'};

    int c[64],d,i=0,base;

    long n;

    printf("enter a number:\n");

    scanf("%1d",&n);

    printf("enter new basc:\n");

    scanf("%d", &base);

    do

    { c[i]=(4);

    i++; n=n/base;

    } while(n!=0);

    printf("transmite new base:\n");

    for(--i;i>=0;--i)

    { d=c[i];

    printf("%c",(5));

    }

    }


    正确答案:(1)x=a[i] (2)a[k]=x (3)k=m+1 (4) n% base (5)b[d]
    (1)x=a[i] (2)a[k]=x (3)k=m+1 (4) n% base (5)b[d] 解析:函数3.1的思想是依次将数组中的每一个元素插入到有序段中,使有序段的长度不断地扩大。对于待插入元素,先用二分查找法找出应该插入的位置。然后将元素插入。对数组来说,就是将该位置以后的元素依次后移,然后将待插入元素放到移出来的空位中。
    程序3.2用的思想是除base(base在二~十六进制之间)取余法求得相应进制数,然后再转换输出。

  • 第15题:

    阅读以下说明和C代码,将应填入(n)处的字句写在答题纸的对应栏内。

    说明

    某单位举办了一场知识竞赛,参加竞赛的选手为300名,依次从1~300进行编号。竞赛时间为9:00~11:00。8道竞赛题目依次从“A”~“H”编号,选手可按任意次序答

    题,每完成一道题目,可立即提交答案。若答案正确(Y),则选择其他题目进行解答,否则,可继续做该题目或选择其他题目进行解答,直至竞赛结束。

    选手提交答案的情况及判定结果由专人即时录入,录入的数据如表1所示,对竞赛情况进行统计和排名的结果如表2所示。

    统计和排名的规则如下:

    1.若选手X在竞赛时提交的题目P解答正确,则解答该题目所用时间如下计算;

    解答题目P的用时=提交题目P正确的时间-竞赛的开始时间+罚时

    罚时=提交题目P错误解答的次数×20

    例如=表1中14号选手在10:27提交了题目A的正确解答,因此该选手正确解答该题目所用时间为87分钟,由于之前的两次提交错误解答,罚时为2×20=40分钟,所以14号选手解答题目A的用时=87+40=127(分钟)。

    2.已经提交正确答案的题目再次提交时不再计算。

    3.竞赛结束时,选手的总用时为所有解答正确的题目用时累加所得,解答不正确的题目不计时。

    4.排名时,完成题目数量多者排名靠前;若完成的题目数相同,则用时少者排名靠前;若完成的题目数和所用时间均相等,则名次相同;完成题目数为。的选手不参加排名。

    函数void Statistic()的功能是:读取输入数据,进行统计、排名并输出结果。

    define MAXN 300

    typedef stmct{

    int no; /*选手编号*/

    int num; /*完成的题目数量*/

    int time; /*完成题目的总用时*/

    int d[8]; /*d[i]用于记录提交第i个题目错误答案的次数*/

    int a[8]; /*a[i]用于记录第i个题目是否已经提交正确答案*/

    }Info;

    void Statistic() {

    char ch,pass;

    int i,j,k,h,m,t,time,Maxlndex;

    Info R[MAXN+1 ];

    for(i=1; i<=MAXN; i++){ /*数组R的元素置初值0*/

    R[i].no = 0;R[i].num = 0; R[i].time = 0;

    for(j=0; j<8; j++) {R[i].d[j] = 0; R[i].a[j] = 0;}

    }/*for*/

    MaxIndex = 0;

    while (1){

    /*录入一名选手提交答案的信息(小时:分钟,选取手编号,题目号,是否正确)*/

    scanf("%d:%d,%d,%c,%c",&h,&m,&k,&ch,&pass);

    if(h==0) break;

    R[k].no = k; /*k为选手编号码*/

    time=(1); /*计算答题时间,以分钟为单位*/

    if(isupper(ch)) ch = 'a' + ch- 'A';

    if(pass != 'Y' && pass != 'y') {R[k].d[ch-'a']++; continue;}

    if (R[k].a[ch-'a']==1) continue;

    R[k].a[ch-'a'] = 1;

    R[k] .num++;

    R[k].time +=(2);

    if (k > MaxIndex) Maxlndex = k;

    }/*while*/

    for(i=l; i<MaxIndex; i++) { /*选取择排序*/

    for(t=i,j=i+1; j<=Maxlndex; j++)

    if(R[t].num<R[j].num|| (3))t=j;

    if((4)) {R[0]=R[t];R[t]=R[i];R[i]=R[0];}

    }/*for*/

    k=1; R[0] = R[l];

    for(i=1; i<=Maxlndex; i++) /*输出排名情况*/

    if (R,[i].num > 0) {

    if(R[i].num!=R[0].num||R[i].time!=R[0].time) k++;

    R[0]=(5);

    printf("%d:%3d %4d %5d\n",k,R[i].no,R[i].num,R[i].time);

    )/*if*l<


    正确答案:(1)(h-9)*60+m及其等价形式 (2)time+R[k].d[ch-'a']*20 其中ch-'a'可以表示为ch-97R[k]可以表示为R[R[k].no] (3)Rrq.num=R[j].num && R[t].time>R[j].time及其等价形式 (4)t!=i及其等价形式 (4)R[i]及其等价形式
    (1)(h-9)*60+m,及其等价形式 (2)time+R[k].d[ch-'a']*20 其中ch-'a'可以表示为ch-97,R[k]可以表示为R[R[k].no] (3)Rrq.num=R[j].num && R[t].time>R[j].time,及其等价形式 (4)t!=i及其等价形式 (4)R[i],及其等价形式 解析:本题考查的是通过阅读程序说明,在限定条件下进行程序设计的能力。
    在函数Statistic()中,h:m表示竞赛选手提交解答的时间。根据注释,空(1)处用于计算以分钟为单位的答题时间。用提交时间减去竞赛开始时间,就是解答一个题目所用的时间,即空(1)处填入:(h-9)*60+m。
    统计过程中采用小写英文字母表示题目的编号,因此语句
    if(isupper(ch))ch='a'+ch-'A';
    用于将题目编号ch统一为小写字母。
    函数中,while循环用于统计每个选手提交答案的情况,采用了直接存取的方法,即k号选手的数据记录在下标为k的数组元素中,即k号选手提交编号为ch的题目情况用R[k].d[ch-'a']和R[k].a[ch-'a']记录,其中,d[ch-'a']用于记录提交编号为ch的题目的错误答案次数,a[ch-'a']则用于记录编号为ch的题目是否已经提交正确答案,以防止一个正确答案被同一名选手反复提交造成重复统计,相应的语句为
    if(R[k].a[ch-'a']==1)continue;
    因此,“R[k].a[ch-'a']=1;”表示选手k首次正确提交了题目ch的解答,同时记录他解答正确的题目数加1,即“R[k).num++;”。已正确解答的题目总用时,由解答用时和罚时两部分组成,因此空(2)处应填入“time+R[k].d[ch-'a']*20”。
    完成统计后,排名所需的数据都记录在结构体数组R[]的成员NO、nurn和time中,数组成员d[]和a[]就不再有用了。
    根据输入数据完成统计之后,需要进行排序。函数Statistic()中采用的是简单选择排序,n个元素进行简单选择排序的基本思想是:通过n-1(1≤i≤n)次元素值之间的比较,从 n-i+1个元素中选出值最小的元素(用t记录该最小元素在数组中的下标),,并和第i个元素进行交换,当i等于n时所有记录有序排列。根据排序规则,完成题目数量相同时,总用时少者排名靠前,因此空(3)处应填入“R[t].num==R[j].num && R[t].time>R[j].time”,显然,若第i个元素本来就是最小元素,则无需交换,即空(4)处填入“t!=i”或其等价形式。
    输出排名情况时,应注意并列名次问题。下面的代码段用于输出排名情况。
    k=-1;R[0]=R[1];
    for(i=1;i=Maxlndex;i++)/*严输出排名情况*/
    if(R[i].num>0){
    if(R[i].num!=R[0].num||R[i].time!=R[0].time)k++;
    R[0]=(5);
    printf("%d:%3d%4d%5d\n",k,R[i].no,R[i].num,R[i].time);
    }/*if*/
    显然,k表示选手的名次。R[0]记录的是R[i-1]的值,因此,排序后相邻的两个记录若完成题目数和总用时相同,则输出相同的名次号(即k不变)。因此,空(5)处填入“R[i]。

  • 第16题:

    阅读以下说明,将应填入(n)处的字句写在答卷纸的对应栏内。

    【说明】

    下面的程序为堆排序程序,其中函数adjust(i,n)是把以R[i](1≤i≤┕i/2┙)为根的二叉树调整成堆的函数,假定R[i]的左、右子树已经是堆,程序中的,是在主函数中说明的结构数组,它含有要排序的n个记录。

    【程序】

    Void adjust(i,n)

    Int i,n;

    {

    iht k,j;

    element extr;

    extr=r[i];

    k=i;

    j=2*i;

    while (j<=n )

    {if ((j<n) && (r[j].key<r[j+1].key))

    (1);

    if (extr. key<r[j].key)

    {

    r[k]=r[j];

    k=j;

    (2);

    }

    else

    (3);

    }

    r[k]=extr;

    }

    /*让i从┗i/2┛逐步减到1, 反复调用函数adjust, 便完成建立初始堆的过程。*/

    void heapsort (r,n)

    list r;

    int n;

    {

    int i,1;

    element extr;

    for (i=n/2;i>=1;- -i)

    (4); /* 建立初始堆*/

    for (k--n;k>=2;k- -)

    {

    extr=r[1];

    r[1]=r[k];

    r[k]=extr;

    (5);

    }

    }


    正确答案:(1)j++ (2)j*=2或j=k*2 (3)j=n+1或break (4)adjust(in) (5)adjust(1k-1)
    (1)j++ (2)j*=2或j=k*2 (3)j=n+1或break (4)adjust(i,n) (5)adjust(1,k-1) 解析:函数adjust(i,n)是把以R[i](1≤i≤┗i/2┛)为根的二叉树调整成堆的函数,假定R[i]的左、右子树已经是堆,程序中的r是在主函数中说明的结构数组,它含有要排序的n个记录。
    Void adjust(i,n)
    Int i,n;
    {
    int k,j;
    element extr;
    extr=r[i];
    k=i;
    j=2*i;
    while(j=n)
    {if((jn)&&(r[j].keyr[j+ 1].key))
    j++;
    if(extr.keyr[j].key)
    {
    r[k]=r[j];
    k=j;
    j*=2;
    }
    else
    j=n+1;
    }
    r[k]=extr;
    }
    /* 让i从┗i/2 ┛逐步减到1, 反复调用函数adjust, 便完成建立初始堆的过程。堆排序程序heapsort 如下*/
    void heapsort(r,n)
    list r;
    int n;
    {
    int i,l;
    element extr;
    for (i=n/2;i>= 1 ;--i)
    adjust(i,n); /*建立初始堆*/
    for(k=n;k>=2;k--)
    {
    extr=r[1];
    r[1]=r[k];
    r[k]=extr;
    adjust(1,k-1);
    }
    }
    函数heapsoff的第一个for循环建立初始化。没待排序的n个记录组成—棵深度为h的完全二叉树,因此有2h-1n≤2h+1-1,即2h≤n2h+1。完全二叉树的第i层(设根结点的层次为0)上最多有2i个结点,对每个非叶结点,都要调用过程adjust,同时可能移动结点(向下移动),第i层上的结点可能要移动的最大距离为h-i,若设向下移动一层花费的时间为c,则第i层2i个结点调整的时间最多为c*(h-i)*2i建立初始堆的全部时间应是:
    令j=h-1,则i=h-j,所以有:
    对第二个for循环,调用adjust函数n-1次,每次总是由根向下调整,调整的最大距离为log2n(实际上,调整的距离是逐渐变小的),所以总的时间不多于c*(n-1)log2n=O(log2n).堆排序总的时间为:
    O(n)+O(nlog2n)=O(max(n,n log2n))=O(n log2n)
    算法需要的存储空间是存储n个记录的数组以及少量暂存单元。
    堆排序算法是不稳定的。

  • 第17题:

    阅读下列算法说明和流程图1,回答问题1至问题3,将解答填入答题纸的对应栏内。

    【算法说明】

    某旅馆共有N间客房。每间客房的房间号、房间等级、床位数以及占用状态分别存放在数组ROOM、RANK、NBED和STATUS中。房间等级值为1、2或3。房间的状态值为0(空闲)或1(占用)。客房是以房间(不是床位)为单位出租的。

    本算法根据几个散客的要求预订一间空房。程序的输入为:人数M,房间等级要求R(R=0表示任意等级都可以)。程序的输出为:所有可供选择的房间号。

    流程图1描述了该算法。

    【问题1】

    假设当前该旅馆各个房间的情况见表3。

    当输入M=4,R=0时,该算法的输出是什么?

    【问题2】

    如果等级为r的房间每人每天的住宿费为RATE(r),RATE为数组。为使该算法在输出每个候选的房间号RM(J)后,再输出这批散客每天所需的总住宿费DAYRENT(J),流程图1的β所指框中的最后处应增加什么处理?

    【问题3】

    如果限制该算法最多输出K个可供选择的房间号,则在流程图1的α所指的判断框应改成什么处理?

    【流程图1】(如图2所示)

    图2


    正确答案:

    ●试题一

    [问题1

    【答案】101301

    【解析】当M=4,R=0表示客人数为4,对房间等级没有要求,根据流程图,依次判断各个房间是否满足要求,1014张床且房间空闲,满足要求;102202已被占用,排除,201床数为3<4,排除;3016张床,且未被占用,满足条件,所以,输出结果为:101301

    [问题2

    【答案】RATERANKI))*M->DAYRENTJ

    【解析】房间的费用是根据房间的等级和房间所住客人的数量决定,所以在β框中应加入RATERANKI))*M->DAYRENTJ)。

    [问题3

    【答案】I>N||jK,其中,J=K也可写成JK

    【解析】若要限制算法最多输出K个房间号,也就是说,该程序执行输出结果的条件应为:(1)所有房间都已检查完,且满足条件的房间数小于等于K。(2)没有检查完但满足条件的房间数已等于K,所以α框中的条件应该改为I>N||jK

  • 第18题:

    阅读下列程序,回答问题: LDR R0, 0x22 LDR R1, 0x11 SUB R0, R0, R1 CMP R0, R1 执行这段程序后,R0的值为()

    • A、 0x22
    • B、 0x33
    • C、 0x11
    • D、 0

    正确答案:C

  • 第19题:

    阅读下列程序,回答问题: LDR R0, 0x22 LDR R1, 0x11 SUB R0, R0, R1 CMP R0, R1 执行上述程序后,CPSR的下列哪个标志位将发生变化()

    • A、 C
    • B、 V
    • C、 Z
    • D、 以上都不对

    正确答案:C

  • 第20题:

    在下面冒泡排序算法中填入适当内容,以使该算法在发现有序时能及时停止。 bubble(R) Rectype R[n]; {int i,j,exchang; Rectype temp; i=1; do {exchang=False; for(j=n;j>=¬¬i+1 ;j- -) if(R[j]


    正确答案:i=i+1

  • 第21题:

    单选题
    统筹图上的任一工序,其工序单时差r(i,j)和工序总时差R (i,j)的关系,下列说法正确的是:()。
    A

    如果r(i,j)=0,则必有R(i,j)=0。

    B

    如果r(i,j)>0,则必有R(i,j)=0。

    C

    如果R(i,j)>0,则必有r(i,j)=0。

    D

    如果R(i,j)=0,则必有r(i,j)=0。


    正确答案: D
    解析: 暂无解析

  • 第22题:

    填空题
    在下面冒泡排序算法中填入适当内容,以使该算法在发现有序时能及时停止。 bubble(R) Rectype R[n]; {int i,j,exchang; Rectype temp; i=1; do {exchang=False; for(j=n;j>=¬¬i+1 ;j- -) if(R[j]

    正确答案: i=i+1
    解析: 暂无解析

  • 第23题:

    单选题
    网络图上的任一工序,其工序单时差r(i,j)和工序总时差R (i,j)的关系,下列说法正确的是:()。
    A

    如果r(i,j)=0,则必有R(i,j)=0

    B

    如果r(i,j)>0,则必有R(i,j)=0

    C

    如果R(i,j)>0,则必有r(i,j)=0

    D

    如果R(i,j)=0,则必有r(i,j)=0


    正确答案: D
    解析: 暂无解析