假定对元素序列(7, 3, 5, 9, 1, 12)进行堆排序,

题目

假定对元素序列(7, 3, 5, 9, 1, 12)进行堆排序,并且采用小根堆,则由初始数据构成的初始堆为()。

  • A、 1, 3, 5, 7, 9, 12
  • B、 1, 3, 5, 9, 7, 12
  • C、 1, 5, 3, 7, 9, 12
  • D、 1, 5, 3, 9, 12, 7
如果没有搜索结果或未解决您的问题,请直接 联系老师 获取答案。
相似问题和答案

第1题:

若一组记录的排序码为(7,9,3,5,1,2,10),则利用堆排序的方法建立的初始堆为()

A.10,7,9,3,5,1,2

B.10,9,7,5,1,2,3

C.10,9,7,5,3,2,1

D.10,9,7,3,2,1,5


正确答案:B

第2题:

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

【说明】

将一正整数序列{K1,K2,…,K9}重新排列成一个新的序列,新序列中,比K1小的数都在K1的前面(左面),比K1大的数都在K1的后面(右面),最后调用writeDat()函数的新序列输出到文件out.dat中。

在程序中已给出了10个序列,每个序列有9个正整数,并存入数组a[10][9]中,分别求出这10个新序列。

例:序列{6,8,9,1,2,5,4,7,3}

经重排后成为{3,4,5,2,1,6,8,9,7}

【函数】

include < stdio. h >

include < conio. h >

void jsValue( int a [10] [9] )

{ int i,j,k,n,temp;

int b[9];

for(i=0;i<10;i++)

{ temp=a[i] [0];

k=8;n=0;

for(j=8;j=0;j--)

{ if(temp < a[i] [j]) (1)=a[i][j];

if(temp >a[i] [j]) (2)=a[i][j];

if(temp =a[i] [j]) (3)= temp;

}

for(j=0;j<9;j++) a[i][j] =b[j];

}

}

void main( )

int a[10] [9] = {{6,8,9,1,2,5,4,7,3},{3,5,8,9,1,2,6,4,7},

{8,2,1,9,3,5,4,6,7}, {3,5,1,2,9,8,6,7,4},

{4,7,8,9,1,2,5,3,6}, {4,7,3,5,1,2,6,8,9},

{9,1,3,5,8,6,2,4,7}, {2,6,1,9,8,3,5,7,4},

{5,3,7,9,1,8,2,6,4}, {7,1,3,2,5,8,9,4,6}

};

int i,j;

(4);

for(i=0;i<10;i++) {

for(j=0;j<9;j++) {

printf("%d",a[i] [j] );

if((5))printf(",");

}

printf(" \n" );

}

getch( );

}


正确答案:(1)b[k--] (2)b[n++] (3)b[n] (4)jsValue(a) (5)j=7
(1)b[k--] (2)b[n++] (3)b[n] (4)jsValue(a) (5)j=7 解析:在主函数中先要调用函数jsValue()对数组a进行处理,所以(4)空应填入“jsValue(a)”。然后输出数组元素,同一行的元素之间用逗号分隔,所以(5)空应填入“j=7”。
函数jsValue()是将数组按题目要求进行排序。通过观察发现处理后的数组中元素的顺序与原来的顺序相反,并且每一行中没有与第一个数相同的数,所以是从后往前处理,也就是将每组从最后往前倒序逐个问第一个数比较,比它大的就放到临时数组b中的最后,比它小的就放到临时数组b中的最前面,以次类推,所以(1)空应填入“b[k- -]”,(2)空应填入“b[n++],(3)空应填入“b[n]”。最后将b数组赋给a数组。

第3题:

元素1,3,5,7按顺序依次进栈,则该栈的不可能输出序列是( )(进栈出栈可以交替进行)。

A.7,5,3,1

B.7,5,1,3

C.3,1,7,5

D.1,3,5,7


参考答案:B

第4题:

设有关键码序列(Q;G,M,Z,A,N,B,P,X,H,Y,S,T,L,K,E),采用堆排序法进行排序,经过初始建堆后关键码值B在序列中的序号是( )。

A)1

B)3

C)7

D)9


正确答案:B
建堆的算法:首先将要排序的所有关键码放到一棵完全二叉树的各个结点中(这时的二叉树不具备堆的特性),然后,从i=[n/2](n为结点的个数)的结点Ki开始,逐步把以K[n/2],K[n/2]-1,K[n/2]-2,..为根的子树排成堆,直到以K1为根的树排成堆,就完成了建堆过程。此题中,n=16,i=[16/2]=8,即从第8个结点开始,建堆完成后如下图:

所以经过初始建堆后关键码值B在序列中的序号是3。

第5题:

下列程序的功能是:将一个正整数序列{K1, K2,…, K9}重新排列成一个新的序列。在新序列中,比K1小的数都在K1的前面(左面),比K1大的数都在K1的后面(右面)。要求编写函数jsValue()实现以上功能,最后调用函数writeDat(),将新序列输出到文件out.dat中。说明:程序中已给出了10个序列,每个序列中有9个正整数,并存入数组a[10][9] 中,分别求出这10个新序列。例如:序列{6, 8, 9, 1, 2, 5, 4, 7, 3}重排后为{3, 4, 5, 2, 1, 6, 8, 9, 7}。部分源程序已给出。请勿改动主函数main() 和写函数writeDat() 的内容。#include<stdio.h>void jsValue(int a[10][9]){ } void main(){ int a[10][9]={{6,8,9,1,2,5,4,7,3} {3,5,8,9,1,2,6,4,7} {8,2,1,9,3,5,4,6,7} {3,5,1,2,9,8,6,7,4} {4,7,8,9,1,2,5,3,6} {4,7,3,5,1,2,6,8,9} {9,1,3,5,8,6,2,4,7} {2,6,1,9,8,3,5,7,4} {5,3,7,9,1,8,2,6,4} {7,1,3,2,5,8,9,4,6} }; int i,j; jsValue(a); for(i=0;i<10;i++){ for(j=0;j<9;j++) { printf("%d",a[i][j]); if(j<=7) printf(","); } printf("\n");}writeDat(a);}void writeDat(int a[10][9]){ FILE *fp; int i,j; fp=fopen("out.dat","w"); for(i=0;i<10;i++){ for(j=0;j<9;j++){ fprintf(fp,"%d",a[i][j]); if(j<=7) fprintf(fp,","); } fprintf(fp,"\n");} fclose(fp);}


正确答案:参考试题解析
【解析及答案】
本题的任务是把排序函数jsValue() 补充完整。本题的处理过程是对数组a[10][9] 中的每行数据分别处理,然后再放置到原来的数组a[10][9] 中。求解时需要使用一个[10][9] 的临时数组b存放处理时的中间结果。数组a处理完以后,就用数组b的内容代替数组a的内容。对每行数据进行处理时,首先需要准备两个指示器nk,分别指向数组b中该行的开头和结尾。然后,反向扫描数组a中对应的行。如果碰到比该行第1个数据值大的元素,就将其放到指示器k指向的位置;如果碰到比其数据值小的元素,就将其放到指示器n指向的位置。处理完以后,还要移动指示器nk,使其定位在新的位置,以接收后面的数据。如果碰到和其数据值相等的元素,由题意可知,这样的元素在新数组中只允许出现1次,所以直接把这个元素放到指示器nk指向的位置即可,但不必移动指示器,否则该元素有可能出现多次。综上所述,完整的排序函数jsValue() 如下。
jsvalue(int a[10][9])
{
  int i,j,k,n,temp;
  int b[9]=0;
   for(i=0;i<10;i++)

    temp=a[i][0];
     k=8; 
    n=0;
    for(j=8,j>=0;j--)     
{    
      if(temp<a[i][j]) 
          b[k--]=a[i][j];
      if(temp>a[i][j])  
          b[n++]=a[i][j];
      if(temp==a[i][j])  
          b[n]=temp;     /*也可以b[k]=a[i][j];*/
}
    for(j=0;j<9;j++)
  {
      a[i][j]=b[j];
      b[j]=0;}
  }
}

第6题:

若将元素10插入到堆A=(15,13,9,5,12,8,7,4,0,6,2,1)中,调用maxHeaplnsert函数进行操作,则新插入的元素在堆A中第(9)个位置(从1开始)。


正确答案:(9)3
(9)3 解析:依照maxHeapInsert的算法,可有如下几步:
第一步:i=13 PARENT(i)=6key=10 A->int_array [PARENT(i)]=8
由于key>A->int_array[PARENT(i)]
所以符合while循环条件,执行:
A->int_array[i]=A->int_array[PARENT(i)];
i=PARENT(i);
即:

第二步:i=6 PARENT(i)=3key=10 A->int_array [PARENT (i)]=9
由于key>A->int_array[PARENT(i)]
所以符合while循环条件,执行:
A->int_array[i]=A->int_array[PARENT(i)];
i=PARENT(i);
即:

第三步:i=3 PARENT(i)=1key=10 A->int_array [PARENT(i)]=15
由于keyint_array[PARENT(i)]
所以不符合while循环条件,跳出循环。
执行:A->int_array[i]=key;
即:

所以,插入元素10的位置在第三个位置。

第7题:

对有18个元素的有序表做折半查找,则查找A[3]的比较序列的下标依次为(13)。

A.1-2-3

B.9-5-2-3

C.9-5-3

D.9-4-2-3


正确答案:D
解析:折半查找按[(max-min)/2]查找。

第8题:

请写出用冒泡排序法对序列(5,1,7,3,1,6,9,3,2,7,6)进行第-遍扫描后的中间结果是________。


正确答案:
(1,1,5,3,2,6,7,3,6,7,9)【分析】冒泡排序法的基本过程:首先,从表头开始往后扫描线性表,在扫描过程中逐次比较相邻两个元素的大小,若前面的元素大于后面的元素,则将他们交换,这样最大者交换到了表的最后面;然后,从后往前扫描剩下的线性表,同样,在扫描过程中逐次比较相邻两个元素的大小若后面的元素小于前面的元素,则将他们交换,这样最小者交换到了表的最前面;从前往后和从后往前扫描一个来回称为-遍:对剩下的线性表重复上述过程,直到剩下的线性表变为空为止.这样线性表就变为有序了。
现在我们来看看对线性表(5,1,7,3,l,6,9,3,2,7,6)从前往后进行扫描的过程:
5>15和l交换位置得到(1,5,7,3,l,6,9,3,2,7,6)
5<7不管,继续往后扫描,扫描到7
7>37和3交换位置得到(1,5,3,7,1,6,9,3,2,7,6)
7>17和1交换位置得到(1,5,3,l,7,6,9,3,2,7,6)
7>67和6交换位置得到(1,5,3,1,6,7,9,3,2,7,6)
7<9不管,继续往后扫描,扫描到9
9>39和3交挟位置得到(1,5,3,l,6,7,3,9,2,7,6)
9>29和2交换位置得到fl,5,3,1,6,7,3,2,9.7,6)
9>79和7交换位置得到(1,5,3,1,6,7,3,2,7,9,6)
9>69和6交换位置得到(1,5,3,l,6,7,3,2,7,6,9)
从前往后扫描结束,9交换到了线性表的最后。
现在我们来看看对剩下的线性表(1,5,3,1,6,7,3,2,7,6)从后往前进行扫描的过程:
6<76和7交换位置得到(1,5,3,l,6,7,3,2,6,7)
6>2不管,继续往前扫描,扫描到外模式或用户模式

第9题:

设有初始序列(8,5,2,12,7,1,6,10,9,3,4,11),排序后产生新序列(4,5,2, 3,7,1,6,8,9,10,12,11),问采用的是下列哪一个排序算法一趟扫描的结果?( )

A.堆排序

B.初始步长为4的希尔排序

C.二路归并排序

D.以8为分界元素的快速排序


正确答案:D
解析:快速排序是对起泡排序的一种改进,其基本思想是:通过一趟排序将待排序记录n个成独立的两部分,其中一部分记录比关键字小,一部分比关键字大,再分别对这两部分记录进行同样的排序操作。

第10题:

对关键字序列(6,1,4,3,7,2,8,5)进行快速排序时,以第1个元素为基准的一次划分的结果为 ( )

A.(5,1,4,3,6,2,8,7)

B.(5,1,4,3,2,6,7,8)

C.(5,1,4,3,2,6,8,7)

D.(8,7,6,5,4,3,2,1)


正确答案:C

更多相关问题