完善程序:序列重排
全局数组变量 a 定义如下:
const int SIZE = 100;
int a[SIZE], n;
它记录着一个长度为 n 的序列 a1, a2, …, an。
现在需要一个函数,以整数 p(1≤p≤n) 为参数,实现如下功能:将序列 a 的前 p 个数与后 n−p 个数对调,且不改变这 p 个数(或 n−p 个数)之间的相对位置。例如,长度为 5 的序列 1,2,3,4,5,当 p=2 时重排结果为 3,4,5,1,2。
算法一:时间复杂度 O(n)、空间复杂度 O(n)
void swap1( int p )
{
int i, j, b[SIZE];
for ( i = 1; i <= p; i++ )
b[①] = a[i]; // (3分)
for ( i = p + 1; i <= n; i++ )
b[i - p] = ②; // (3分)
for ( i = 1; i <= ③; i++ ) // (2分)
a[i] = b[i];
}
算法二:时间换空间,时间复杂度 O(n²)、空间复杂度 O(1)
void swap2( int p )
{
int i, j, temp;
for ( i = p + 1; i <= n; i++ )
{
temp = a[i];
for ( j = i; j >= ④; j-- ) // (3分)
a[j] = a[j - 1];
⑤ = temp; // (3分)
}
}
选择题
(1) ①处应填()。
A. p+i
B. n-p+i
C. n-p+i-1
D. i
(2) ②处应填()。
A. a[i]
B. a[i-p]
C. a[n-i]
D. b[i]
(4) ④处应填()。
A. 1
B. i-p
C. n-i
D. i-p+1
(5) ⑤处应填()。
A. a[i-p+1]
B. a[i]
C. a[i-p]
D. a[i-1]