【题目】
(1) 给出算法的基本设计思想。
(2) 根据设计思想,采用C或c++或Java语言描述算法,关键之处给出注释。(3)说明你所设计算法的时间复杂度和空间复杂度。
【答案要点】
(1) 给出算法的基本设计思想:
先将n个数据x0,x1,xp,…,xn-1,…,xn-1原地逆置,得到xn-1,…,xp,xp-1,…,x0, 然后再将前n-p个和后p个元素分别原地逆置,得到最终结果:xp,xp+1,…,xn-1,x0,x1,…, xp-1。
(2) 算法实现:
void reverse(int r[ ],int left,int right)
{
int k=left,j=right,temp; //k等于左边界left,j等于右边界right while(k
{ //交换r[k]与r[j] temp:r[k]; r[k]=r[j]; r[j]=temp;
k++: //k右移一个位置
j--; //j左移一个位置
}
}
void leftShift(int r[ ],int n,int p)
{
if(p>0&&p
{
reverse(r,0,n-1); //将全部数据逆置reverse(r,0,n-p-1); //将前n-p个元素逆置reverse(r,n-p,n-1); //将后p个元素逆置
}
}
(3) 说明算法复杂性:上述算法的时间复杂度为0(n),空间复杂度为0(1)。