← 查看本卷题目
组合题5 个小题
已作答 0 / 5

完善程序: (序列重排) 全局数组变量 aa 定义如下:

const int SIZE = 100;int a[SIZE], n;

它记录着一个长度为 nn 的序列 a1,a2,…,ana_1, a_2,\dots,a_n。 现在需要一个函数,以整数 p(1≤p≤n)p(1\leq p\leq n) 为参数,实现如下功能:将序列 aa 的前 pp 个数与后 n−pn-p 个数对调,且不改变这 pp 个数(或 n−pn-p 个数)之间的相对位置。例如,长度为 55 的序列 1,2,3,4,51, 2, 3, 4, 5,当 p=2p = 2 时重排结果为 3,4,5,1,23, 4, 5, 1, 2 。 有一种朴素的算法可以实现这一需求,其时间复杂度为 O(n)O(n)、空间复杂度为 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(n2)O(n^2)、空间复杂度为 O(1)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 分)	}}
第 29 题填空题

③处应填( )

填写答案