38. 完善下列程序,每小题在pascal语言(a)和c语言(b)中任选一题。下面的程序将数列1,2,3,…,n*n,依次按蛇型方式存放在二维数组a[1..n,1..n]中。即 (示意圖编者略)。
(a)算法的pascal 语言程序描述(编者略):(b)算法的c语言程序描述:
#define nmax 10
#include “stdio.h”
main()
{ int i,j,n,k,p,q,m;
int a [nmax][nmax];
scanf(“%d”,&n);
m=1;
for(k=1;(1) ;k++)
{if(k<n) q=k; else(2) __;
for(p=1;p<=q;p++)
{if(3) {i=q-p+1;j=p;}
else{i=p;j=q-p+1;}
if(4) {i=i+n-q;j=j+n-q;}
a[i][j]=m;(5) _;
}
for(i=1;i<=n;i++)
{ for(j=1;j<=n;j++)
printf(“%4d”,a[i][j]);printf(“\n”);
}
}
} 【上海大学 2002 六、1 (10分)】
18. 数组 h[ 1:1000] 中存放着1000个大小不同的正整数;
(1) 选择一分类算法使能最快地得到其中10个最大的数,简要说明理由;
(2) 编写一程序seek() ,执行该程序时,在命令行中提供二个参数;
seek a n<enter> 表示需打印h[ ]中n个最大数。
seek i n<enter> 表示需打印h[ ]中n个最小数。 【浙江大学 1994 八 (18分)】
19.已知两个定长数组,它们分别存放两个非降序有序序列,请编写程序把第二个数组序列中的数逐个插入到前一个数组序列中,完成后两个数组中的数分别有序(非降序)并且第一数组中所有的数都不大于第二个数组中的任意一个数。注意,不能另开辟数组,也不能对任意一个数组进行排序操作。例如,
第一个数组为:4,12,28
第二个数组为:1,7,9,29,45
输出结果为:1,4,7--------------第一个数组
9,12,28,29,45---------第二个数组 【上海大学 1998 四 (20分)】
20. 设数组a[1..n]中,a[n-2k+1..n-k]和[n-k+1..n]中元素各自从小到大排好序,试设计一个算法使a[n-2k+1..n]按从小到大次序排好序。并分析算法所需的计算时间。【福州大学 1998 四、3 (10分)】
21. 设a[1..100]是一个记录构成的数组,b[1..100]是一个整数数组,其值介于1至100之间,现要求按b[1..100]的内容调整a中记录的次序,比如当b[1]=ll时,则要求将a[1]的内容调整到a[11]中去。规定可使用的附加空间为o(1)。【中科院计算所 2000 七(15分)】
22. 给定有m个整数的递增有序数组a[1..m]和有n个整数的递减有序数组b[1..n],试写出算法:将数组a和b归并为递增有序数组c[l..m+n]。(要求:算法的时间复杂度为o(m+n))
【华中理工大学 2000 八、1(10分)】
23.在数组 a[1..n]中有n个数据,试建立一个带有头结点的循环链表,头指针为h,要求链中数据从小到大排列,重复的数据在链中只保存一个。【南京理工大学 1998 七、2 (7分)】
责任编辑:小草