完善程序:序列重排

全局数组变量 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]

(3) ③处应填()。

A. n
B. p
C. p+1
D. n-1

(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]