题目:
分析:
课上讲过,归并算法思路。
代码:
int all=0;
void mergesort(vector<int> &n,i,j)
{
if(i==j)
{
return;
}
if(i+1==j){
if(n[i]>n[j])
{
all++;
int c=n[i];n[i]=n[j];n[j]=c;
}
return;
}
mergesort(n,i,(i+j)/2);
mergesort(n,(i+j)/2+1,j);
//先看逆序对个数
int c=(i+j)/2+1;
for(int k=i;k<=(i+j)/2;k++)
{
if(c==j+1) all+=j-(i+j)/2;
else{
for(;c<=j;c++)
{
if(n[c]>=n[k]) break;
}
all+=c-(i+j)/2-1;
}
}
if(n[(i+j)/2]<=n[(i+j)/2+1]) return;
vector<int> A(j-i+1,0);
int c1=i,c2=(i+j)/2+1;
for(int k=0;k<j-i+1;k++)
{
if(c1==(i+j)/2+1)
{
A[k]=n[c2];
c2++;
continue;
}
if(c2==j+1)
{
A[k]=n[c1];
c1++;
continue;
}
if(n[c1]>n[c2])
{
A[k]=n[c2];c2++;
}
else
{
A[k]=n[c1];c1++;
}
}
for(int k=0;k<j-i+1;k++)
{
n[i+k]=A[k];
}
}