回 帖 发 新 帖 刷新版面

主题:求逆序数的O(nlogn)的算法谁会

求逆序数的O(nlogn)的算法谁会

回复列表 (共8个回复)

沙发

说下分治后怎么合并就行

板凳

用类似归并排序的方法。

3 楼

合并的时候一个指针指i向左边的元素l,有个指针j指向右边的元素r
当r小于l的时候,左边i到mid中的元素则与r构成逆序对。
只用将总数加上mid-i+1就可以了。

4 楼

怎么让分的两个数列有序呢?

5 楼

归并排序的过程啊

6 楼

#include<stdio.h>
#include<stdlib.h>
int total=0;
#define MAX 500

int main()
{int s[MAX];
int i,num;
void recur(int s[],int right);

for(scanf("%d",&num);num!=0;scanf("%d",&num)){
    for(i=1;i<=num;i++)
        scanf("%d",s+i);
    recur(s,num);
    printf("%d\n",total);
    total=0;
}
return 0;
}

void recur(int s[],int right)
{int a;int i;int j=0;
int *s1,*s2;int tempp=0;
int p,q;
if(right==1)
     return;
a=(1+right)/2;
s1=(int *)malloc(right*sizeof(int));
s2=(int *)malloc(right*sizeof(int));
p=0;q=0;
for(i=1;i<=right;i++){
     if(s[i]<s[a]){
         s1[++p]=s[i];
         total+=q;
     }
     else if(s[i]>s[a])
         s2[++q]=s[i];
     else {tempp+=p;j++;total+=q;}
}
total+=p*j-tempp;
if(p!=0)
     recur(s1,p);
if(q!=0)
     recur(s2,q);
free(s1);free(s2);
return;
}

这是我的源码,但提交老是wrong answer;

怎么查也差不出,郁闷

7 楼

#include <stdio.h>
long ans;
void mergesort(long [],int ,int );
void merge(long [],int ,int ,int);

int main ()
{
    long w[10001]; //未排序的数组;
    int t;
    int i,j,n;
    
scanf("%d",&t);
for(i=0;i<t;i++)
{
     ans=0;
     scanf("%d",&n);
     for(j=1;j<=n;j++)
       scanf("%ld",&w[j]);
      
     mergesort(w,1,n);
     printf("%ld\n",ans);
}  
return 0;
}

void mergesort(long a[],int p,int r)
{
   if(p<r)
   {
       int q=(p+r)/2;
      mergesort(a,p,q);
      mergesort(a,q+1,r);
      merge(a,p,q,r);    //合并步骤;
  }
}

void merge(long a[],int p,int q,int r)
{
   int  n1=q-p+1;
   int  n2=r-q;
   int  i,j,k;
    long left[n1+1];
    long right[n2+1];
    
    for(i=1;i<=n1;i++)
         left[i]=a[p+i-1];
    for(j=1;j<=n2;j++)
          right[j]=a[q+j];
    
    left[n1+1]=2000000; //设置一个最大值;
    right[n2+1]=2000000;//同上;
    i=1;
    j=1;
    for(k=p;k<=r;k++)
        if(left[i]<right[j])
                a[k]=left[i++];
        else
            {
             a[k]=right[j++];  
             ans+=n1-i+1;      //计数;
         }
}
  在中科大那里 ac 了。

8 楼

现在OI用C/C++了么?

我来回复

您尚未登录,请登录后再回复。点此登录或注册