编程题

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

const int SIZE = 100;

int a[SIZE], n;

它记录着一个长度为n的序列a[1],a[2], … , a[n]。

现在需要一个函数,以整数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[    (1)    ] = a[i];                           //(3 分)

for (i = p + 1; i <= n; i++)

b[i - p] =    (2)     ;                          //(3 分)

for (i = 1; i <=     (3)     ; i++)                //(2 分)

a[i] = b[i];

}


我们也可以用时间换空间,使用时间复杂度为O(n2)、空间复杂度为O(1)的算法:


void swap2(int p)

{


int i, j, temp;


for (i = p + 1; i <= n; i++) {

temp = a[i];

for (j = i; j >=     (4)     ; j--)                   //(3 分)

a[j] = a[j - 1];

     (5)    = temp;                                                    //(3 分)

}

}

查看答案
赣ICP备20007335号-2