码迷,mamicode.com
首页 > 编程语言 > 详细

Ultra-QuickSort--POJ2299(归并排序求逆序数对)

时间:2016-05-09 12:24:37      阅读:204      评论:0      收藏:0      [点我收藏+]

标签:

 

http://poj.org/problem?id=2299

归并排序:比如现在有一个序列[l,r),我们可以把这个序列分成两个序列[l,mid),[mid,r),利用递归按照上

述方法逐步缩小序列,先使子序列有序,再使子序列区间有序,然后再把有序区间合并,很好滴体现了分治的思想。

逆序数(如果有i<j,存在a[i] > a[j],则称a[i]与a[j]为逆序数对)

#include<stdio.h>
#include<algorithm>
#include<math.h>
#include<cstring>
#include<cstdlib>
#include<queue>
#include<iostream>

using namespace std;
#define N 500050
#define memset(a,b) memset(a,b,sizeof(a))

long long  cont;

int a[N],b[N];

void merge(int l,int r)
{
    if(l>=r)
        return;
    int mid=(l+r)/2;
    merge(l,mid);
    merge(mid+1,r);
    int x=l;
    int y=mid+1,i=l;
    while(x<=mid || y<=r)
    {
        if(y>r || (x<=mid && a[x]<a[y]))
            b[i++]=a[x++];
        else
        {
            if(x<=mid)
                cont+=mid-x+1;
            b[i++]=a[y++];
        }
    }
    for(i=l;i<=r;i++)
        a[i]=b[i];
}

int main()
{
    int n;
    while(scanf("%d",&n),n)
    {
        for(int i=0;i<n;i++)
        {
            scanf("%d",&a[i]);
        }
        cont=0;
        merge(0,n-1);///归并排序
        printf("%lld\n",cont);
    }
    return 0;
}

 

Ultra-QuickSort--POJ2299(归并排序求逆序数对)

标签:

原文地址:http://www.cnblogs.com/linliu/p/5473351.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!