组合题5 个小题
已作答 0 / 5
完善程序: (序列重排) 全局数组变量 a 定义如下:
1const int SIZE = 100;2int 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):
1void swap1( int p )2{3 int i, j, b[SIZE];4 for ( i = 1; i <= p; i++ )5 b[①] = a[i]; // (3分)6 for ( i = p + 1; i <= n; i++ )7 b[i - p] = ②; // (3分)8 for ( i = 1; i <= ③; i++ ) // (2分)9 a[i] = b[i];10}我们也可以用时间换空间,使用时间复杂度为 O(n2)、空间复杂度为 O(1) 的算法:
1void swap2( int p )2{3 int i, j, temp;4 for ( i = p + 1; i <= n; i++ )5 {6 temp = a[i];7 for ( j = i; j >= ④; j-- ) // ( 3 分)8 a[j] = a[j - 1];9 ⑤ = temp; // ( 3 分)10 }11}④处应填( )