2010计算机硕士统考试题赏析

题干:设将n(n>1)个整数放进一维数组R中。试设计一个时间和空间上都高效的算法。将R中保存的序列循环左移p(0<p<n)个位置,即将R中的数据由(x0,x1,x2,…xn-1) => (xp,xp+1,xp+2,xn-1…x0,x1…xp-1)

(1)给出算法的基本设计思想;
(2)根据算法思想,采用C或者C++或者Java语言描述算法,关键之处给出注释;
(3) 说明你的算法的时间复杂度和空间复杂度。

算法解析:设数组中的(x0,x1,…,xp-1) 等于a,(xp,xp+1,…,xn-1)等于b。开始时原数列为ab,而要求的数列为ba。
(1) 先将原数列ab里面a(p个元素)倒置,得到a-1 b;(-1代表-1次方)
(2) 再将得到的数列b(n-p个元素)进行倒置,得到a-1 b-1;
(3) 最后把整个数列进行倒置,得到(a-1 b -1)-1,也就是ba

void reverse(int A[],int from,int to){
	//这里from,to是数组的下标,这个函数内部需要三个参数
	int i,temp;
	for (i=0;i<(to-from+1)/2;i++){
		//这里需要交换的元素个数是(to-from+1)/2
		temp = A[from+i];
		A[from+i] = A[to-i];
		A[to-i] = temp;
	}

void Converse(int R,int n,int p){
	reverse(int R,0,p-1);		//依次反转a,b以及R
	reverse(int R,p,n-1);
	reverse(int R,0,n-1);
}

(3)上面的时间复杂度依次是O(p/2),O(n-p/2),O(n/2)。总体的时间复杂度O(n),空间复杂度O(1).

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值