Yurchiu's Blog

归并排序

Yurchiu 2021-05-01, 20:49:37 622 隐藏左右两栏 展示左右两栏

归并排序,是创建在归并操作上的一种有效的排序算法。算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。归并排序思路简单,为稳定排序算法,一般用于对总体无序,但是各子项相对有序的数列。

图示:

模板

#include<bits/stdc++.h>
using namespace std;
namespace _yz
{
	const int N=500000+10;
	int n,a[N],b[N];
	void Sort(int l,int r)
	{
		if(l>=r) return;
		int mid=(l+r)/2;
		int p1=l,p2=mid+1,pos=l;
		Sort(l,mid);Sort(mid+1,r);
		while(p1<=mid&&p2<=r)
		{
			if(a[p1]<=a[p2]) b[pos++]=a[p1++];
			else b[pos++]=a[p2++]; 
		}
		while(p1<=mid) b[pos++]=a[p1++];
		while(p2<=r) b[pos++]=a[p2++];
		for(int i=l;i<=r;i++) a[i]=b[i];
	}
    void yzmain()
    {
    	scanf("%d",&n);
    	for(int i=1;i<=n;i++) scanf("%d",a+i);
    	Sort(1,n);
    	for(int i=1;i<=n;i++) printf("%d ",a[i]);
        return;
    }
}
int main()
{
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    _yz::yzmain();
    return 0;
}

求逆序对

归并排序是将数列 [l,r][l,r] 分成两半 [l,mid][l,mid][mid+1,r][mid+1,r] 分别进行归并排序,然后再将这两半合并起来。

在合并的过程中(设 limidl\le i\le midmid+1jrmid+1\le j\le r),当 aiaja_i\le a_j 时,并不产生逆序数;当 ai>aja_i> a_j 时,在前半部分中比 aia_i 大的数都比 aja_j 大,将 aja_j 放在 aia_i 前面的话,逆序数要加上 midi+1mid-i+1。因此,可以在归并排序中的合并过程中计算逆序数。

#include<bits/stdc++.h>
using namespace std;
namespace _yz
{
	const int N=500000+10;
	int n,a[N],b[N];
	long long ans=0;
	void Sort(int l,int r)
	{
		if(l>=r) return;
		int mid=(l+r)/2;
		int p1=l,p2=mid+1,pos=l;
		Sort(l,mid);Sort(mid+1,r);
		while(p1<=mid&&p2<=r)
		{
			if(a[p1]<=a[p2]) b[pos++]=a[p1++];
			else b[pos++]=a[p2++],ans+=mid-p1+1; 
		}
		while(p1<=mid) b[pos++]=a[p1++];
		while(p2<=r) b[pos++]=a[p2++];
		for(int i=l;i<=r;i++) a[i]=b[i];
	}
    void yzmain()
    {
    	scanf("%d",&n);
    	for(int i=1;i<=n;i++) scanf("%d",a+i);
    	Sort(1,n);
    	printf("%lld\n",ans);
        return;
    }
}
int main()
{
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    _yz::yzmain();
    return 0;
}




本文作者:Yurchiu

本文链接:https://yz-hs.github.io/9d13b6ee3755/

版权声明:本博客中所有原创文章除特别声明外,均允许规范转载,转载请注明出处。所有非原创文章,按照原作者要求转载。


By Yurchiu.
其他物件杂物收纳
Hitokoto

Yurchiu 说,除了她以外的人都很强!嘤嘤嘤~~
博客信息
文章数目
158
最近更新
08-21
本站字数
350.6k
文章目录