递归与分治

递归

一、
1、求阶乘
int Factorial(int n){
	if(n==0)	return 1;
	return  n*Factorial(n-1);	
}

2、
Fibonacci函数

int Fibonacci(int n){
	if(n==1)	return 1;
	if(n==2)	return 1;
	return Fibonacci(n-1)+Fibonacci(n-2);
}

3、全排列:
在这里插入图片描述
(1)、字符串的全排列

主函数见(2).
int Permutation(char a[],int k,int m){
	if(k==m){
		for(int i=0;i<=m;i++){
			cout<<a[i];
		}
		cout<<endl;
	}else{
		for(int i=k;i<=m;i++){
			swap(a[k],a[i]);
			Permutation(a,k+1,m);
			swap(a[i],a[k]);
			
		}
	}
} 

(2)、数式的全排列

#include<iostream>
#include<vector> 
#include<malloc.h>
#include<algorithm>

using namespace std;

int Permutation(int a[],int k,int m){
	if(k==m){
		int d,b,c;
		d=a[0]*100+a[1]*10+a[2];
		b=a[3]*100+a[4]*10+a[5];
		c=a[6]*100+a[7]*10+a[8]; 
		if(d+b==c){
			cout<<d<<"+"<<b<<"="<<c<<endl;
		}
		
	}else{
		for(int i=k;i<=m;i++){
			swap(a[k],a[i]);
			Permutation(a,k+1,m);
			swap(a[i],a[k]);
			
		}
	}
} 

int main(){
	int n;
	while(cin>>n){
		int *arr=new int [n];
	    for(int i=0;i<n;i++){
	    	cin>>arr[i];
		}
		Permutation(arr,0,n-1);	
	}	
	return 0;
}

4、整数划分问题

//n为加数,m为加数约束条件(n<=m);q(n,m)即为将最大加数n1不大于m的划分个数。 

int q(int n,int m){
	if((n<1)||(m<1))	return 0;
	if((n==1)||(m==1))	return 1;
	if(n<m) return q(n,n);  
	if(n==m)	return q(n,m-1)+1;
	return q(n,m-1)+q(n-m,m);
}

5、Hanoi塔问题
在这里插入图片描述

void move(int n,char A,char B){
	cout<<++step<<" : move "<<n<<" from "<<A<<" to "<<B<<endl;
}

void Hanoi(int n,char A,char B,char C){
	if(n>0){
		Hanoi(n-1,A,C,B);
		move(n,A,C);
		Hanoi(n-1,B,A,C);
	}
}

补充:(动态一维数组的开辟)

#include<iostream>
#include<vector> 
#include<malloc.h>

using namespace std;

int main(){
	int n;
	int *arr=0;
	while(cin>>n){
		int a[n];
		int *b=new int [n];
	    //arr=(int *)malloc(sizeof(int)*n);
	    for(int i=0;i<n;i++){
	    	//cin>>arr[i];
	    	cin>>a[i];
		}
		for(int i=0;i<n;i++){
	    	//cin>>arr[i];
	    	cout<<a[i]<<" ";
		}
		
	}	
	return 0;
}

分治

二、
1、二分查找法
(1)、非递归算法 ``` int BinarySearch(int a[],int key,int low,int high){
while(low<=high){
	int mid=(low+high)/2;
	if(a[mid]==key) return mid;
	else if(a[mid]<key) low=mid+1;
	else high=mid-1;
}
return -1;
}

(2)、递归算法

//递归算法
int BinarySearch(int a[],int key,int low,int high){
	if(low>high)	return -1;
	int mid=(low+high)/2;
	if(key==a[mid])	return mid;
	else if(key<a[mid])	return BinarySearch(a,key,low,mid-1);
	else	return BinarySearch(a,key,mid+1,high);
} 

//主函数 
int main(){
	int n;
	while(cin>>n){
		int * a=new int [n];
		for(int i=0;i<n;i++){
			cin>>a[i];
		}
		int key=0;
		cin>>key; 
		int result=BinarySearch(a,key,0,n-1);
		cout<<result<<endl;		
	}
	return 0;
}

2、归并排序

#include<iostream>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
using namespace std;
const int maxn=100;



void Merge(int SR[],int s,int m,int t){
	int i=s,j=m+1,k=s;
	int temp[maxn];
	int index=0;
	while(i<=m&&j<=t){
		if(SR[i]<SR[j])	temp[index++]=SR[i++];
		else	temp[index++]=SR[j++];
	}
	while(i<=m)	temp[index++]=SR[i++];
	while(j<=t)	temp[index++]=SR[j++];
	for(int i=0;i<index;i++){
		SR[s+i]=temp[i];
	}
}

void MergeSort(int SR[],int s,int t){
	if(s<t){
		int mid=(s+t)/2;
		MergeSort(SR,s,mid);
		MergeSort(SR,mid+1,t);
	//	int * TR=new int [1000];
		Merge(SR,s,mid,t);
	//	memcpy(SR,TR,(t-s)+1);
	//	for(int i=0;i<t;i++){
	//		cout<<TR[i]<<" ";
	//	}
	//	cout<<endl;
	}
}

int main(){
	int n;
	while(cin>>n){
		int * a=new int [n];
		for(int i=0;i<n;i++){
			cin>>a[i];
		}
		MergeSort(a,0,n-1);
		for(int i=0;i<n;i++){
			cout<<a[i]<<" ";
		}
		cout<<endl;		
	}
	return 0;
}

3、快速排序

(1)、非随机化快排

#include<iostream>

using namespace std;

int partition(int A[],int left,int right){
	int temp=A[left];
	while(left<right){
		while(left<right&&temp<A[right])	right--;
		A[left]=A[right];
		while(left<right&&temp>=A[left])	left++;
		A[right]=A[left]; 
	} 
	A[left]=temp;
	return left;
	
	
}

void QuickSort(int A[],int left,int right){
	if(left<right){
		int pos=partition(A,left,right);
		QuickSort(A,left,pos);
		QuickSort(A,pos+1,right);
		 
	} 
	
}


int main(){
	int n;
	while(cin>>n){
		int * a=new int [n];
		for(int i=0;i<n;i++){
			cin>>a[i];
		}
		QuickSort(a,0,n-1);
		for(int i=0;i<n;i++){
			cout<<a[i]<<" ";
		}
		cout<<endl;		
	}
	
	return 0;
}

(2)、随机化快排
根据上一个的主函数改写Partition函数即可,在每一次的开始随机的选取一个元素作为主元,这样的优点时在对已有顺序的序列排序时候的效率会很高


//随机化快排注意添加头文件<stdlib.h> 
int randPartition(int A[],int left,int right){
	//int p=(round(1.0*rand()/RAND_MAX*(right-left)+left));
	int p=rand()%(right-left+1)+left;
	swap(A[p],A[left]);
	int temp=A[left];
	while(left<right){
		while(left<right&&temp<A[right])	right--;
		A[left]=A[right];
		while(left<right&&temp>=A[left])	left++;
		A[right]=A[left]; 
	} 
	A[left]=temp;
	return left;
} 
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值