|
2.2.3 顺序表其它算法举例
例2-5 试设计一个算法,用尽可能少的辅助空间将顺序表中前 m 个元素和后 n 个元素进行互换,即将线性表(
,,…,,,,…,
) 改变成( ,,…,,
,,…,
)。
算法2.10
void invert( ElemType &R[], int s, int
t )
{
//
本算法将数组 R 中下标自 s 到 t 的元素逆置,即将
// (Rs,Rs+1,…,Rt-1,Rt)改变为(Rt,Rt-1,…,Rs+1,Rs)
for ( k=s; k<=(s+t)/2; k++ )
{
w = R[k];
R[k] = R[t-k+s];
R[t-k+s] = w;
} // for
} // invert
算法2.11
void exchange ( SqList &A,int
m )
{
//
本算法实现顺序表中前 m 个元素和后 n
个元素的互换
if ( m > 0 &&
m < A.length ){
n = A.length - m;
invert( A.elem, 0, m+n-1 );
invert( A.elem, 0, n-1 );
invert( A.elem, n, m+n-1 );
}
} // exchange
|
|
解题分析:
此题的难点在于要求用尽可能少的辅助空间。如果没有这个限制,可以另设一个和已知顺序表空间大小相同的顺序表,然后进行元素复制即可。
此题的一种比较简单的算法是,从表中第
m+1 个元素起依次插入到元素
之前。则首先需将该元素 (k=1,2,…,n)暂存在一个辅助变量中,然后将它之前的
m 个元素(
,,…,
)依次后移一个位置。显然,由于对每一个
都需要移动 m 个元素,因此算法的时间复杂度为 O
(m×n)。
也可采用另一种算法为,对顺序表进行三次"逆置",第一次是对整个顺序表进行逆置,之后分别对前
n 个和后 m 个元素进行逆置。
由于逆置顺序表可以利"交换"相应元素进行,其时间复杂度为线性级别,则三次调用逆置算法完成的操作的时间复杂度仍然是线性级别的,即为
O
(m+n)。 |
|