boolDel_Min(SqList &L, ElemType &value){if(L.length ==0)returnfalse;
value = L.data[0];int pos =0;for(int i =1; i < L.length; i ++)if(L.data[i]< value){
value = L.data[i];
pos = i;}
L.data[pos]= L.data[L.length -1];
L.length --;returntrue;}
2.
题意 :设计一个高效算法,将顺序表L的所有元素逆置,要求算法的空间复杂度为
O
(
1
)
O(1)
O(1)。
思路 :扫描顺序表L的前半部分元素,对于元素
L
.
d
a
t
a
[
i
]
(
0
<
=
i
<
L
.
l
e
n
g
t
h
/
2
)
L.data[i](0<=i<L.length/2)
L.data[i](0<=i<L.length/2),将其与后半部分的对应元素
L
.
d
a
t
a
[
L
.
l
e
n
g
t
h
−
i
−
1
]
L.data[L.length - i - 1]
L.data[L.length−i−1]进行交换。
voidReverse(SqList &L){
ElemType temp;for(int i =0; i < L.length /2; i ++){
temp = L.data[i];
L.data[i]= L.data[L.length - i -1];
L.data[L.length - i -1]= temp;}}
3.
题意 :对长度为n的顺序表L,编写一个时间复杂度为
O
(
n
)
O(n)
O(n),空间复杂度为
O
(
1
)
O(1)
O(1)的算法,该算法删除线性表中所有值为x的数据元素。
boolDel_s_t(SqList &L, ElemType s, ElemType t){if(s >= t || L.length ==0)returnfalse;int i, k =0;for(i =0; i < L.length; i ++){if(L.data[i]>= s && L.data[i]<= t)
k ++;else
L.data[i - k]= L.data[i];}
L.length -= k;returntrue;}
题意 :已知在一维数组
A
[
m
+
n
]
A[m+n]
A[m+n]中依次存放两个线性表
(
a
1
,
a
2
,
.
.
.
,
a
m
)
(a_1,a_2,...,a_m)
(a1,a2,...,am)和
(
b
1
,
b
2
,
.
.
.
,
b
n
)
(b_1,b_2,...,b_n)
(b1,b2,...,bn)。试编写一个函数,将数组中两个顺序表的位置互换,即将
(
b
1
,
b
2
,
.
.
.
,
b
n
)
(b_1,b_2,...,b_n)
(b1,b2,...,bn)放在
(
a
1
,
a
2
,
.
.
.
,
a
m
)
(a_1,a_2,...,a_m)
(a1,a2,...,am)的前面。
思路 :先将数组
A
[
n
+
m
]
A[n+m]
A[n+m]中的全部元素
(
a
1
,
a
2
,
.
.
.
,
a
m
,
b
1
,
b
2
,
.
.
.
,
b
n
)
(a_1,a_2,...,a_m,b_1,b_2,...,b_n)
(a1,a2,...,am,b1,b2,...,bn)原地逆置为
(
b
n
,
.
.
,
b
1
,
a
m
,
.
.
.
,
a
1
)
(b_n,..,b_1,a_m,...,a_1)
(bn,..,b1,am,...,a1),再对前n个元素和后m个元素分别使用逆置算法,即可实现顺序表的位置互换。
typedefint DataType;voidReverse(DataType A[],int left,int right,int arraySize){if(right <= left || right >= arraySize)return;int mid =(left + right)/2;for(int i =0; i <= mid - left; i ++){
DataType temp = A[left + i];
A[left + i]= A[right - i];
A[right - i]= temp;}}voidExchange(DataType A[],int m,int n,int arraySize){Reverse(A,0, m + n -1, arraySize);Reverse(A,0, n -1, arraySize);Reverse(A, n, m + n -1, arraySize);}
9.
题意 :线性表
(
a
1
,
a
2
,
.
.
.
,
a
n
)
(a_1,a_2,...,a_n)
(a1,a2,...,an)中的元素递增有序且按顺序存储于计算机内。要求设计一个算法,完成用最少时间在表中查找数值为x的元素,若找到,则将其与后继元素位置相交换,若找不到,则将其插入表中并使表中元素仍递增有序。
voidSearchExchangeInsert(ElemType A[], ElemType x){int low =0, high = n -1, mid;while(low <= high){
mid =(low + high)/2;if(A[mid]== x)break;if(A[mid]< x) low = mid +1;else high = mid -1;}if(A[mid]== x && mid != n -1){
t = A[mid], A[mid]= A[mid +1], A[mid +1]= t;}if(low > high){for(i = n -1; i > high; i --)
A[i +1]= A[i];
A[i +1]= x;// A[high + 1] = x;}}
10.
2010统考真题
题意 :设将
n
(
n
>
1
)
n(n>1)
n(n>1)个整数存放到一维数组R中。设计一个在时间和空间两方面都尽可能高效的算法。将R中保存的序列循环左移
p
(
0
<
p
<
n
)
p(0<p<n)
p(0<p<n)个位置,即将R中的数据由
(
X
0
,
X
1
,
.
.
.
,
X
n
−
1
)
(X_0,X_1,...,X_{n-1})
(X0,X1,...,Xn−1)变换为
(
X
p
,
X
p
+
1
,
.
.
.
,
X
n
−
1
,
X
0
,
X
1
,
.
.
.
,
X
p
−
1
)
(X_p,X_{p+1},...,X_{n-1},X_0,X_1,...,X_{p-1})
(Xp,Xp+1,...,Xn−1,X0,X1,...,Xp−1)。要求:
算法的基本设计思想 :可将这个问题视为把数组ab转换成数组ba(a代表数组的前p个元素,b代表数组中余下的n-p个元素),先将a逆置得到
a
−
1
b
a^{-1}b
a−1b,然后将b逆置得到
a
−
1
b
−
1
a^{-1}b^{-1}
a−1b−1,最后将整个逆置得到
(
a
−
1
b
−
1
)
−
1
=
b
a
(a^{-1}b^{-1})^{-1}=ba
(a−1b−1)−1=ba。设Reverse函数执行将数组元素逆置的操作,且两个参数分别表示数组中待转换元素的始末位置。
使用C语言描述算法如下 :
voidReverse(int R[],int from,int to){int i, temp;for(i =0; i <(to - from +1)/2; i ++){
temp = R[from + i];
R[from + i]= R[to - i];
R[to - i]= temp;}}voidConverse(int R[],int n,int p){Reverse(R,0, p -1);Reverse(R, p, n -1);Reverse(R,0, n -1);}
上述算法中三个Reverse函数的时间复杂度分别为
O
(
p
/
2
)
,
O
(
(
n
−
p
)
/
2
)
,
O
(
n
/
2
)
O(p/2),O((n-p)/2),O(n/2)
O(p/2),O((n−p)/2),O(n/2),故所设计的算法的时间复杂度为
O
(
n
)
O(n)
O(n),空间复杂度为
O
(
1
)
O(1)
O(1)
11.
2011统考真题
题意 :一个长度为L
(
L
>
=
1
)
(L>=1)
(L>=1)的升序序列S,处在第
[
L
/
2
]
[L/2]
[L/2]个位置的数称为S的中位数。例如,若序列
S
1
=
(
11
,
13
,
15
,
17
,
19
)
S_1=(11,13,15,17,19)
S1=(11,13,15,17,19),则
S
1
S_1
S1的中位数是15,两个序列的中位数是含它们所有元素的升序序列的中位数。现在有两个等长升序序列A和B,试设计一个在时间和空间两方面都尽可能高效的算法,找出两个序列A和B的中位数。要求:
12.
2013统考真题
题意 :已知一个整数序列
A
=
(
a
0
,
a
1
,
.
.
.
,
a
n
−
1
)
A=(a_0,a_1,...,a_{n-1})
A=(a0,a1,...,an−1),其中
0
<
=
a
n
<
n
(
0
<
=
i
<
n
)
0<=a_n<n(0<=i<n)
0<=an<n(0<=i<n)。若存在
a
p
1
=
a
p
2
=
=
.
.
.
=
a
p
m
=
x
a_{p1}=a_{p2}==...=a_{pm}=x
ap1=ap2==...=apm=x且m>n/2
(
0
,
=
p
k
<
n
,
1
<
=
k
<
=
m
)
(0,=p_k<n,1<=k<=m)
(0,=pk<n,1<=k<=m),则称x为A的主元素。例如…。假设A中的n个元素保存在一个一维数组中,请设计一个尽可能高效的算法,找出A的主严肃,若存在则输出,否则输出-1。要求:
题意 :定义三元组
(
a
,
b
,
c
)
(a,b,c)
(a,b,c)(a,b,c均为正数)的距离
D
=
∣
a
−
b
∣
+
∣
b
−
c
∣
+
∣
c
−
a
∣
D=|a-b|+|b-c|+|c-a|
D=∣a−b∣+∣b−c∣+∣c−a∣。给定三个非空整数集合
S
1
,
S
2
,
S
3
S_1,S_2,S_3
S1,S2,S3,按升序分别存储在3个数组中,请设计一个尽可能高效的算法,计算并输出所有可能的三元组
(
a
,
b
,
c
)
(
a
属
于
S
1
,
b
属
于
S
2
,
c
属
于
S
3
)
(a,b,c)(a属于S_1,b属于S_2,c属于S_3)
(a,b,c)(a属于S1,b属于S2,c属于S3)中的最小距离。要求 :