分治——hyl天梦

Posted tianmeng-hyl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分治——hyl天梦相关的知识,希望对你有一定的参考价值。

分治

什么是分治?

顾名思义,分而治之(废话),他可以把一个复杂的问题简单化,从全部到局部,逐渐缩小问题规模,从而变得更高效。

怎么变得高效

  • 下面举两个因为分治而变得高效的排序算法,相信大家也早有耳闻。
快速排序
  • 思路:首先##随便##找一个轴值,把所有比轴值小的数排在左边,比轴值大的数排在右边然后再在轴值左边和右边分别递归重复这一步骤。
  • 代码:
void qsort(int l,int r)
{
	if(l>=r) return;
	ll i=l,j=r,mid=a[l+r>>1];//这里把随机弄成取中间数了,也可以去其他数
	for(int h=l;h<=r;h++)
	{
		if(a[h]>mid) c[j--]=a[h];
		if(a[h]<mid) c[i++]=a[h];
	}
	for(int p=i;p<=j;p++) c[p]=mid;
	for(int h=l;h<=r;h++) a[h]=c[h];
	qsort(l,i-1);
	qsort(j+1,r);
}
归并排序
  • 思路:把序列平均分成两段,然后归并
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<sstream>
#include<queue>
#include<vector>
#define ll long long
#define dd double 
#define N 2000001
using namespace std;

ll a[N],c[N],n;

void msort(ll l,ll r)
{
	if(l>=r) return;
	ll mid=l+r>>1,i=l,j=mid+1,tail=l;
	msort(l,mid);
	msort(mid+1,r);
	while(i<=mid&&j<=r)
	{
		if(a[i]<=a[j]) c[tail++]=a[i++];
		else c[tail++]=a[j++];
	}
	while(i<=mid) c[tail++]=a[i++];
	while(j<=r) c[tail++]=a[j++];
	for(int h=l;h<=r;h++) a[h]=c[h];
}

int main()
{
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	msort(1,n);
	for(int i=1;i<=n;i++) cout<<a[i]<<" ";
	return 0;
}

以上是关于分治——hyl天梦的主要内容,如果未能解决你的问题,请参考以下文章

UVA540 Team Queue——题解 by hyl天梦

STL综合 容器常用集合 —— hyl天梦

P2571 [SCOI2010]传送带——hyl天梦

P1559 运动员最佳匹配问题 by hyl 天梦

如何快速正确的写出各种分治算法的实现代码

用kettle抽取的数据时会不会出现两边的数据不一样