merge sort

#include"stdio.h"
#include"iostream"
using namespace std;
#define maxn 1000000
__int64 t[maxn],a[maxn];
__int64 Count;
void sort(int x,int y)
{
	if(y-x>1)
	{
		int m=x+(y-x)/2;
		int p=x,q=m,i=x;
		sort(x,m);sort(m,y);
		while(p<m||q<y)
		{
			if(q>=y||(p<m&&a[p]<=a[q])) //改变 a[p1] 和  a[p2] 之间的符号改变排序的规则
				t[i++]=a[p++];
			else
			{
				Count+=q-i;		//记录归并排序移动的最小次数
				t[i++]=a[q++];
				//Count+=(m-p);	//记录逆序对
			}
		}
		for(int i=x;i<y;i++) a[i]=t[i];
	}
}
int main()
{
	int n;
	while(scanf("%d",&n)!=EOF)
	{
		Count =0;
		for(int i=0;i<n;i++)
			scanf("%I64d",a+i);
		sort(0,n);
		printf("%I64d\n",Count);
	}
	return 0;
}



#include <iostream>
#include"vector"
#include "stdio.h"
#include"algorithm"
#define fuck(ex) printf(#ex"=%d\n",ex)
#define pf(xs,rx) printf(#xs"sdfsdf"#xs"\n",rx,xs);
#define max(a,b) (a)>(b)?(a):(b);
#define all(a) (a).begin(),(a).end()
#define sf(a) scanf("%d",&a)
#define Swap(t,x,y) {t _z=x;x=y;y=_z;}
using namespace std;
#define LL rt<<1
#define RR rt<<1|1
#define lson l,m,LL
#define rson m+1,r,RR
#define bug puts("bugbug");
const int maxn = 11111;
const int INF=9999999;
int Left[1000],Right[1000];
int a[1000];
void merge(int l,int m,int r)
{
    int i,j,k;
    int n1=m-l+1;
    int n2=r-m;
    for(i=1;i<=n1;i++)
        Left[i]=a[l+i-1];
    for(i=1;i<=n2;i++)
        Right[i]=a[m+1+i-1];
    Left[n1+1]=Right[n2+1]=INF;
    i=j=1;
    for(k=l;k<=r;k++)
    {
        if(Right[i]<=Left[j]) a[k]=Right[i++];
        else a[k]=Left[j++];
    }
}
void merge_sort(int l,int r)      //递归的意思: 自己调用自己,不要往深处想,递归这种事情人能全部模拟,要电脑干嘛
{                                                       
    if(r>l)              //边界设定好大于2的时候才进行 分成左右两队进行排序
    {
        int m=(l+r)/2;
        merge_sort(l,m);  //2.给左半部分排序
        merge_sort(m+1,r); //3.给右半部分排序
        merge(l,m,r);       //4.合并:电脑通过递归帮你左右分成两队排序之后是两个有序序列,
                            //但整个序列并没有排好序,这一步就是最关键的合并
    }

}
int main()
{
    while(1)
    {
        int n;cin>>n;
        int i;for(i=1;i<=n;i++)cin>>a[i];
        merge_sort(1,n); //1.给1-n排序
        for(i=1;i<=n;i++) cout<<a[i]<<" ";cout<<endl;
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值