试题四(共15分)
排序是将一组无序的数据元素调整为非递减顺序的数据序列的过程,堆排序是一种常用的排序算法。用顺序存储结构存储堆中元素。非递减堆排序的步骤是:
(1)将含n个元素的待排序数列构造成一个初始大顶堆,存储在数组R(R[1],R[2],...,R[n])中。此时堆的规模为 n,堆顶元素R[1]就是序列中最大的元素,R[n]是堆中最后一个元素。
(2)将堆顶元素和堆中最后一个元素交换,最后一个元素脱离堆结构,堆的规模减1,将堆中剩余的元素调整成大顶堆;
(3)重复步骤(2),直到只剩下最后一个元素在堆结构中,此时数组R是一个非递减的数据序列。
C代码
下面是该算法的C语言实现。
(1)主要变量说明
n:待排序的数组长度
R[]:待排序数组,n个数放在R[1],R[2],...,R[n]中
(2)代码
#include<stdio.h>
#define MAXITEM 100
/*调整堆
R:待排序数组;
v:节点编号,以v为根的二叉树,R[v]>=R[2v],R[v]>=R[2v+1],且其左子树和右子树都是大顶堆
n:堆结构的规模,即堆中的元素数
*/
void Heapify(int R[MAXITEM],int v,int n){
int i,j;
i=v;
j=2*i;
R[0]=R[i];
while(j<=n){
if(j<n&&R[j]<R[j+1]){
j++;
}
if(R[i]<R[j]){//填空1
R[i]=R[j];
i=j;
j=2*i;
}
else{
j=n+1;
}
}
R[i]=R[0];
}
/*堆排序,R为待排序数组,n为数组大小*/
void HeapSort(int R[MAXITEM],int n){
int i;
for(i=n/2;i>=1;i--){
Heapify(R,i,n);//填空2
}
for(i=n;i>1;i--){//填空3
R[0]=R[i];
R[i]=R[1];
R[1]=R[0];//填空4
Heapify(R,1,i-1);
}
}
问题1(8分)
根据以上说明和C代码,填充C代码中的空(1)~(4)。
问题2 (2分)
根据以上说明和C代码,算法的时间复杂度为(5)(用O符号表示)。
问题3 (5分)
考虑数据序列R=(7,10,13,15,4,20,19,8),n=8,则构建的初始大顶堆为( 6 ),
第一个元素脱离堆结构,对剩余元素再调整成大顶堆后的数组R为( 7 )。
试题六(共15分)
阅读下列说明和JAVA代码,将应填入(n)处的字句写在答题纸的对应栏内。
Facade(外观)模式是一种通过为多个复杂子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式,以医院为例,就医时患者需要与医院不同的职能部门交互,完成挂号、门诊、取药等操作。为简化就医流程,设置了一个接待员的职位,代患者完成上述就医步骤,患者则只需与接待员交互即可。如图6-1给出了以外观模式实现该场景的类图。
package test_2022_2;
interface Patient{
public abstract String getName();//填空1
}
interface Disposer{
public abstract void dispose(Patient patient);//填空2
}
class Resgistry implements Disposer{
public void dispose(Patient patient){
System.out.println("I am registering..."+patient.getName());
}
}
class Doctor implements Disposer{//医生门诊
public void dispose(Patient patient){
System.out.println("I am diagnosing..."+patient.getName());
}
}
class Pharmacy implements Disposer{//取药
public void dispose(Patient patient){
System.out.println("I am medicine..."+patient.getName());
}
}
class Facade{
private Patient patient;
public Facade(Patient patient) {
this.patient = patient;
}
public void dispose(){
Resgistry resgistry=new Resgistry();
Doctor doctor= new Doctor();
Pharmacy ph=new Pharmacy();
resgistry.dispose(patient);
doctor.dispose(patient);
ph.dispose(patient);
}
}
class ConcretePatient implements Patient{
private String name;
public ConcretePatient(String name) {
this.name = name;
}
public String getName(){
return name;
}
}
public class PatientTest {
public static void main(String[] args) {
Patient patient = new ConcretePatient("name");//填空3
Facade f = new Facade(patient);//填空4、5
f.dispose();//填空6
}
}
//输出
// I am registering...name
// I am diagnosing...name
// I am medicine...name