分析: 这是2010年408数据结构的一道算法大题,考察线性表知识。题中要求设计一个在时间和空间都尽可能高效的算法;
(1)思路: 可把该数组R看作两个数组A和B的组合,其中A数组中有p个元素且数组下标为从0~p-1,B数组中有n-p个元素且数组下标为从p~n-1。然后把A和B分别逆置,再整体逆置即可,具体图解如下:
(2)代码实现如下:
void Reverse(int R[],int from,int to)//此Reverse函数的作用是将传进来的一个数组进行逆置,其中from和to分别表示要逆置数组的始末位置
{
int temp;
for(int i=0;i<(to-from+1)/2;i++)
{
temp=R[from+i];
R[from+i]=R[to-i];
R[to-i]=temp;
}
}
void Converse(int R[],int n,int p)
{
Reverse(R,0,p-1);//可看作是数组A的逆置
Reverse(R,p,n-1);//可看作是数组B的逆置
Reverse(R,0,n-1);//可看作是是数组A和B整体逆置
}
(3): 上述三个代码中,时间复杂度分别为:O(p/2)、O((n-p)/2)、O(n/2)。所以综上。该算法的时间复杂度为O(n),空间复杂度为O(1)。