#CS50101. 完善程序1-数组-1序列重排

完善程序1-数组-1序列重排

完善程序

(序列重排)

全局数组变量 a 定义如下:

const int SIZE = 100;

int a[SIZE], n;

它记录着一个长度为 n 的序列 a1,a2,,ana_1, a_2,\dots,a_n

现在需要一个函数,以整数 p(1pn)p(1\leq p\leq 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(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 分)
    }
}
  1. ①处应填( ){{ select(1) }}
  • p+i
  • n-p+i
  • n-p+i-1
  • i
  1. ②处应填( ){{ select(2) }}
  • a[i]
  • a[i-p]
  • a[n-i]
  • b[i]
  1. ③处应填( ){{ select(3) }}
  • n
  • p
  • p+1
  • n-1
  1. ④处应填( ){{ select(4) }}
  • 1
  • i-p
  • n-i
  • i-p+1
  1. ⑤处应填( ){{ select(5) }}
  • a[i-p+1]
  • a[i]
  • a[i-p]
  • a[i-1]