1.5迭代与递归

1、数组求和:迭代

实现:逐一取出,累加之

int SumI(int A[], int n){
	int sum=0;//o(1)
	for(int i=0;i<n;i++){//o(n)
	sum+=A[i];}//o(1)
	return sum;
}

2、数组求和:线性递归

sum(int A[], int n){
	return (n<1)?0:sum(A,n-1)+A[n-1];
}

T(n)=o(n)

3、数组倒置

A[0,n],子区间A[lo,hi]
接口:

void reverse(int* A, int lo, int hi);

递归版:

if(lo<hi){swap(A[lo], A[hi]);reverse(A, lo+1, hi+1);}

迭代版:
while(lo<hi){swap(A[lo++], A[hi–]);}

4、数组求和:二分递归

sum(int A[], int lo, int hi){
	if(lo==hi) return A[lo];
	int mi=(lo+hi)>>1;
	return sum(A,lo,mi)+sum(A,mi+1,hi)
}

T(n)=o(n)

5、Max2:迭代

从数组区间A[lo,hi]中找出最大的数A[x1]>=A[x2]

方法1

void max2(int A[], int lo, int hi, int & x1, int & x2){
	for(x1=lo,int i=lo+1;i<hi;i++){
		if(A[x1]<A[i]) x1=i;
	}
	for(x2=lo,int i=lo+1;i<x1;i++){//扫描x1前的
		if(A[x2]<A[i]) x2=i;
	}
	for(nt i=x1+1;i<hi;i++){//扫描x1后的
		if(A[x2]<A[i]) x2=i;
	}
}

比较总数2n-3

方法2:

void(int A[], int lo, int hi, int & x1, int & x2){
	if(A[x1=lo]<A[x2=lo+1]){swap(x1,x2);}
	for(int i=lo+2;i<hi;i++){
		if(A[x2]<A[i]){
		if(A[x1]<A[x2=i]swap(x1,x2);)
		}
	}
}

最好时:n-1
最坏时:2n-3

方法3:递归+分治

void max2(int A[], int lo, int hi, int & x1, int & x2){
	if(lo+2==hi){if(A[x1=lo]<A[x2=lo+1])swap(x1,x2);}//双人对局
	if(lo+3==hi){
		if(A[x1=lo]<A[x2=lo+1]){swap(x1,x2);}//前两人对局
		if(A[x2]<A[i+2]){
			if(A[x1]<A[x2=i+2]){swap(x1,x2);//加入第三者对局
			}
		}
	}

	int mi=(lo+hi)/2;
	int x1L,x2R;max2(A,lo,mi,x1L,x2L);//东部入围赛
	int x1R,X2R;max2(A,mi,hi,x1R,x2R);//西部入围赛
	if(A[x1L]>A[x1R]){//冠军赛
		x1=x1L;x2=(A[x2L]>A[x1R])?x2L:x1R;//亚军赛
	}else{
		x1=x1R;x2=(A[x1L]>A[x2R])?x1L:x2R;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值