判断题
1-1 数据结构包括数据的逻辑结构、存储结构和运算集合这三部分。
正确
1-2 算法的五大特性为:有限性、确定性、输入、输出、可行性。
正确
1-3 数据的基本逻辑结构为集合结构、线性结构、树形结构、图状结构
正确
单选题
2-1 数据结构可以从逻辑上分成 (C) 两大类。
A.动态结构和静态结构
B.紧凑结构和非紧凑结构
C.线性结构和非线性结构
D.内部结构和外部结构
2.2 数据逻辑结构可以分为( B )。
A.线性结构和图结构
B.集合结构、线性结构、树结构和图结构
C.顺序结构和链式结构
D.集合结构和非线性结构
2-3 算法分析的两个主要方面是( A )。
A.空间复杂度和时间复杂度
B.正确性和简明性
C.可读性和文档性
D.数据复杂性和程序复杂性
2-4 算法设计的要求
设计一个好的算法应该满足正确性、(B)、健壮性和高效性等要求。
A.稳定性 B.可读性 C.可靠性 D.可行性
2-5 算法的特性
一个算法必须满足有穷性、确定性、 ( C ) 、输入和输出等五个重要特性。
A.高效性 B.稳定性 C.可行性 D.可读性
2-6 执行下面程序段时,执行S语句的频度为( D )。
for(int i=0;i<n;i++) for(int j=1;j<=i;j++) S;
A.n^2 B.n^2/2 C.n(n+1) D.n(n+1)/2
2-7 下列程序段的时间复杂度为( B )。
x = n; /*n > 1*/ y = 0; while(x >= (y + 1) * (y + 1)) y = y + 1;
A.Θ(n) B.Θ(n½) C.Θ(1) D.Θ(n2)
2-8 时间复杂度分析
下面算法的时间复杂度为( D )。
int foo(int n) { int i, s = 0; for (i = 1; i * i <= n; ++i) { s += i; } return s; }
A.O(n2) B.O(n) C.O(n) D.O(log2n)
2-9 时间复杂度分析
下面算法的时间复杂度为 ( D )。
int foo(int n) { int i, j, s = 0; for (i = 1; i <= n; ++i) { for (j = 1; j <= i; ++j) { s += i * j; } } return s; }
A.O(n倍根号n) B.O(n) C.O(nlog2n) D.O(n^2)
2-10 时间复杂度分析 下面算法的时间复杂度为( B )。
int foo(int n) { int i, m = n / 2, s = 0; for (i = 1; i <= m; ++i) { s += i; } return s; }
A.O(log2n) B.O(n) C.O(根号n) D.O(n^2)
2-11 时间复杂度分析
下面算法的时间复杂度为 ( A )。
int foo(int n) { int i, s = 0; for (i = 1; i <= n; ++i) { s += i; } return s; }
A.O(n) B.O(根号n) C.O(log2n) D.O(n^2)
2-12 时间复杂度分析
下面算法的时间复杂度为 ( D )。
int foo(int n) { return n * (n + 1) / 2; }
A.O(n) B.O(n2) C.O(根号n) D.O(1)
2-13 设n为正整数,请估算下列程序段的时间复杂度为( C )
i=1; k=0; while(i<=n-1) { k=k+10*i; i++; }
A.O(1) B.O(logn) C.O(n) D.O(n3)
2-14 设n为正整数,请估算下列程序段的时间复杂度为( B )
i=1; j=0; while(i+j<=n) { if(i>j) j++ else i++; }
A.O(1) B.O(n) C.O(n^2) D.O(n3)
2-15 设n为正整数,请估算下列程序段的时间复杂度为( D )
x=n; y=0; /* n>1 */ while(x>=(y+1)*(y+1)) y++;
A.O(1) B.O(n) C.O(logn) D.O(根号n)
2-16 设n为正整数,请估算下列程序段的时间复杂度为( A )
x=91; y=100; while(y>0) { if(x>100) { x=x-10; y--; } else x++; }
A.O(1) B.O(n) C.O(logn) D.O(n2)
执行次数为常数项,时间复杂度用O(1)表示
三、函数题
1. 数组中按值找元素
在数组A[1..N]中查找值为k的元素,若找到输出其位置i(1<=i<=n),否则输出0作为标志。
函数接口定义:
Search(int a[],int n,int k);
其中 a
、 n
、k
都是用户传入的参数。a
为数组名,期中存了n
个整数,下标为1到n
;k
为待查数据元素;若找到了,返回其下标;否则,返回0。
#include <stdio.h> int Search(int a[50],int n,int k) { int i; for(i=1;i<=n;i++) { if(a[i]==k) { return i; } } return 0; }
2.找最大值和次大值
找出数组A[1..N]中最大值和次大值。(数组中元素个数大于两个且值各不相同)
函数接口定义:
void FindMax(int a[],int n,int *pmax1,int *pmax2);
其中 a
和 n
是用户传入的参数。 a
为数组名, n
为数组中元素的个数,在下标从1到n
处存放。利用指针变量 pmax1
和pmax2
带出运算结果。 pmax1
为指向最大值的指针;pmax2
为指向次大值的指针。
void FindMax(int a[],int n,int *pmax1,int *pmax2){ for(int i = 1;i<n;i++){ for(int j = i+1;j<=n;j++){ if(a[i]<a[j]){ int t = a[i]; a[i] = a[j]; a[j] = t; } } } *pmax1 = a[1]; *pmax2 = a[2]; }
在数组中有序排序从大到小,存储在数组中,则数组中第一个元素为最大值,第二个元素为最小值