poj2299~第一次明白了归并排序_#include

想当年,看着算法书的归并排序,一头雾水,现在找到一段好代码,一张好草稿,成功地理解了归并的含义!

#include<iostream>
#include<string>
#define M 500005
using namespace std;

int a[M],Left[M],Right[M];
long long ans;

void merge(int p, int q, int r)
{
int i, j, k, n1, n2;

n1 = q-p+1;
n2 = r-q;
for (i=0; i<n1; i++) //左边一半
{
Left[i] = a[p+i];
}
for (i=0; i<n2; i++) //右边一半,两边都是排好序的
{
Right[i] = a[q+i+1];
}
Left[n1] = Right[n2] = 0x7fffffff; //边界是无穷大值

i = j = 0;
for (k=p; k<=r; k++) //按照大小依次归并
{
if (Left[i] <= Right[j])
{
a[k] = Left[i];
i++;
}
else
{
a[k] = Right[j];
j++;
ans += n1-i; /**此步骤是在归并排序法中加的一句,用来计数求逆序数的数目**/
}
}
}

void mergesort( int p, int r)
{
int q;
if (p < r)
{
q = (p+r)/2;
mergesort(p, q);
mergesort(q+1,r); //将两边排好序在进行归并!
merge(p,q,r);
}
}

int main()
{
int n,i,j;
while(scanf("%d",&n),n!=0)
{
for(i=0;i<n;i++)
scanf("%d",&a[i]);
ans=0;
mergesort(0,n-1);
printf("%lld\n",ans);
}
}