ZOJ 2386 归并排序

这个是归并排序很好例子,下面的代码可以记住,以后碰到归并,可以直接使用了。。。

#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>      // INT_MAX
#include <string.h>
#define MAX 500010
int a[MAX];
int L[MAX/2],R[MAX/2];
long long sum;
void MERGE(int* A,int p,int q,int r)
{
    int n1,n2,i,j,k;
    n1=q-p+1;
    n2=r-q;
    i=0;  j=0;
    for(k=p;k<=q;k++)  L[i++]=A[k];   // 左部分
    L[n1]=INT_MAX;
    for(k=q+1;k<=r;k++)  R[j++]=A[k];     // 右部分
    R[n2]=INT_MAX;
    i=0; j=0;
    for(k=p;k<=r;k++){                   // 归并,递增序列
        if(L[i]<=R[j]) {
            A[k]=L[i];
            i++;              
        }
        else{
            sum+=(n1-i);
            A[k]=R[j];
            j++;    
        }
    }    
}

void MergeSort(int* A,int p,int r)
{
    int q;
    if(p<r){
        q=(p+r)/2;
        MergeSort(A,p,q);
        MergeSort(A,q+1,r);
        MERGE(A,p,q,r);       
    }    
}
int main()
{
    int n,i;
    while(scanf("%d",&n)!=EOF && n){
        sum=0;
        for(i=0;i<n;i++)
           scanf("%d",&a[i]);
        MergeSort(a,0,n-1);
        printf("%lld\n",sum);                   
    }
    system("pause");
    return 0;   
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值