分治算法总结

2021-03-29 03:25

阅读:490

标签:code   pac   mes   快速排序   line   wap   amp   快速   mat   

分治算法定义

将一个问题分解成多个子问题,将问题缩小到一定规模后逐个求解,最后合并所有子问题

分治算法步骤

  1. 分解(将原问题分解成一个形式相同规模更小的子问题)
  2. 解决(递归求解子问题,直到问题的规模足够小,直接求解)
  3. 合并(合并子问题的解,得到原问题的解)

分治算法例题(实际应用)

插入排序

思路

一道十分普通的\(O(n^2)\)时间复杂度题,使用类似打扑克牌时给牌排序的分治思想递归实现即可

即:

先给n-1张牌排序,再分成给n-2张牌排序,以此类推.......

直到只剩1张牌,则直接结束

\(Code\)

#include
using namespace std;
int n,a[110];
void insert_sort(int a[],int n){
	//1.基本情况 
	if(n==1)return;
	//2.分解子问题 
	//3.解决子问题 
	insert_sort(a,n-1);
	int tmp=a[n],i; 
	for(i=n-1;i>=1;i--){
		if(a[i]>tmp){
			a[i+1]=a[i];
		}else{
			break;
		}
	}
	a[i+1]=tmp;
}
int main(){
	scanf("%d",&n);
	for(int i=1;i

归并排序

思路

这道题的数据范围加大,不能再用\(O(n^2)\)算法解决,会导致TLE;故我们可以用归并排序解决

技术图片

\(Code\)

#include
using namespace std;
int n,a[110],b[110];
void merge(int a[],int l,int mid,int r,int t[]){
	int i=l,j=mid+1,k=l;
	while(i>1;
	//3.解决子问题 
	merge_sort(a,l,mid,t);
	merge_sort(a,mid+1,r,t);
	//4.合并子问题的解 
	merge(a,l,mid,r,t);
}
int main(){
	scanf("%d",&n);
	for(int i=1;i

快速排序

思路

使用\(O(n \log n)\)时间复杂度的快速排序,具体步骤看下图

技术图片

\(Code\)

#include
using namespace std;
int n,a[100010];
void quick_sort(int a[],int l,int r){
	//1.基本情况 
	if(l==r)return;//可省略
	//2.分解子问题 
	int i=l,j=r,mid=a[l+rand()%(r-l+1)];
	while(imid)j--;
		if(i

分治算法总结

标签:code   pac   mes   快速排序   line   wap   amp   快速   mat   

原文地址:https://www.cnblogs.com/zhangbeini/p/13617359.html


评论


亲,登录后才可以留言!