当前位置:   article > 正文

分治法及经典例题_分治算法例题

分治算法例题

分治法的基本思想

将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。

分治法的求解过程:

①划分:将整个问题划分为多个子问题,子问题与原问题有相同的类型。
②求解:求解各个子问题(可以使用递归反复调用)
③合并:合并所有子问题的解,形成原问题的解。
在这里插入图片描述

分治算法经典例题1:二分查找

给定一个有序数组,查找某数是否在这个有序数组中。

#include<iostream>
using namespace std;
void search(int a[],int L,int R,int m)
{
	if(L>R)
	{
		cout<<"can not find this number"<<endl;
		return ;
	}
	int mid=(L+R)/2;
	if(a[mid]==m)
	{
		cout<<"find this number:"<<m<<endl;
		return ;
	}
	else if(a[mid]>m)
	{
		search(a,L,mid,m);
	}
	else
	{
		search(a,mid+1,R,m);
	}	
}
int main()
{
	int i,n,m;
	cin>>n;
	int a[n];
	for(i=0;i<n;i++)
	{
		cin>>a[i];
	}
	cin>>m;
	search(a,0,n-1,m);
	return 0;
 } 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

结果展示:

在这里插入图片描述

分治算法经典例题2:求数组中的最大最小值

#include<iostream>
using namespace std;
void fx(int *a,int L,int R,int &max,int &min)
{
	if(R-L==0||R-L==1)//递归出口 
	{
		min=a[L]<a[R]?a[L]:a[R];
		max=a[L]>a[R]?a[L]:a[R];
		return ;
	}
	int temp=(R+L)/2;
	int max1,max2,min1,min2;
	fx(a,L,temp,max1,min1);//分 
	fx(a,temp+1,R,max2,min2);
	max=max1>max2?max1:max2;//治 
	min=min1<min2?min1:min2;
	return ;
}
int main()
{
	int n,i;
	cin>>n;
	int *a=new int[n];	
	for(i=0;i<n;i++)
	{
		cin>>a[i];
	}
	int max,min;
	fx(a,0,n-1,max,min);
	cout<<"max="<<max<<"\tmin="<<min<<endl;
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

结果展示:

在这里插入图片描述

分治算法经典例题3:快速排序

#include<iostream>
using namespace std;
int partition(int a[],int m,int n)
{
	int L=m;
	int R=n;
	int k=a[L];
	int temp;
	while(L<R)
	{
		L++;
		while(a[L]<=k)
		{
			L++;
		}
	//	R--;
		while(a[R]>k)
		{
			R--;
		}
		if(L<R)
		{
			temp=a[L];
			a[L]=a[R];
			a[R]=temp;
		}
	}
	a[m]=a[R];
	a[R]=k;
	return R;
 } 
 int* Q_sort(int a[],int m,int n)//快速排序 
 {
 	if(m<n)
 	{
 		int j=partition(a,m,n);
 		Q_sort(a,m,j-1);
 		Q_sort(a,j+1,n);
	 }
	 return a;
 }
 int main()
 {
 	
 	int n,i;
 	cin>>n;
	int a[n];
 	for(i=0;i<n;i++)
 	{
 		cin>>a[i];
	 }
	 Q_sort(a,0,n-1);
	 for(i=0;i<n;i++)
	 {
	 	cout<<a[i]<<"\t";
	 }
	 cout<<"\n";
	 return 0;
 }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59

结果展示:

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/716332
推荐阅读
相关标签
  

闽ICP备14008679号