#CS50101. 完善程序1-数组-1序列重排
完善程序1-数组-1序列重排
完善程序
(序列重排)
全局数组变量 a 定义如下:
const int SIZE = 100;
int a[SIZE], n;
它记录着一个长度为 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];
}
我们也可以用时间换空间,使用时间复杂度为 、空间复杂度为 的算法:
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 分)
}
}
- ①处应填( ){{ select(1) }}
- p+i
- n-p+i
- n-p+i-1
- i
- ②处应填( ){{ select(2) }}
- a[i]
- a[i-p]
- a[n-i]
- b[i]
- ③处应填( ){{ select(3) }}
- n
- p
- p+1
- n-1
- ④处应填( ){{ select(4) }}
- 1
- i-p
- n-i
- i-p+1
- ⑤处应填( ){{ select(5) }}
- a[i-p+1]
- a[i]
- a[i-p]
- a[i-1]