【算法5】n个整数存在一维数组R中,试编写算法,将R中序列循环左移p个位置

算法分析
要求将序列 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;
}

运行结果如下:

循环左移5位的结果

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值