算法分析
要求将序列 x0,x1,x2…xp-1,xp,xn-2,xn-1,xn
循环左移p位,使得序列呈 xp,xp+1,…xn,x0,x1,x2…,xp-1
本质上还是把整个表中的两个子表:
x0----xp-1,与其后的xp----xn逆置即可。
算法思想
1)把子序列:x0----xp-1 逆置成 xp-1----x0
2)把子序列:xp----xn逆置成xn----xp
3)经过1),2)操作序列呈:
xp-1----x0,xn----xp
然后在将整个序列,逆置呈:
xp,xp+1,…xn,x0,x1,x2…,xp-1
算法设计(递归)
#inclue <stdio.h>
//定义一个交换函数,方便操作
void swap(int* a,int* b)
{
int temp=0;
temp=(*a);
(*a)=(*b);
(*b)=temp;
}
//递归逆置算法(针对顺序表)
//参数不多说,可以看之前写的逆置算法
void Reverse(int a[],int low,int high)
{
if(low<high)
{
swap(&a[low],&a[high]);
Reverse(a,low+1,high-1);
}
}
//函数名:Reverse_Seg
//函数功能:整段交换两段子表
//函数参数:
void Reverse_Seg(int a[],int p,int len)
{
if(p<0||p>len)
{
printf("输入错误,要求左移位数处于(0,%d)\n",len);
}
else
{
Reverse(a,0,p-1);
Reverse(a,p,len-1);
Reverse(a,0,len-1);
}
}
int main()
{
int i=0;
int p=0
//其中1,2,3,4,5,6 为a线性表,7,8,9,10为b线性表
int A[10]={1,2,3,4,5,6,7,8,9,10};
for(i=0;i<10;i++)
{
printf("%d\t",A[i]);
}
printf("\n");
scanf("%d",&p);
Reverse(A,0,p-1);
Reverse(A,p,9);
Reverse(A,0,9);
for(i=0;i<10;i++)
{
printf("%d\t",A[i]);
}
printf("\n");
return 0;
}
运行结果如下: