主题:求逆序数的O(nlogn)的算法谁会
birdfly324
[专家分:20] 发布于 2005-10-07 09:39:00
求逆序数的O(nlogn)的算法谁会
回复列表 (共8个回复)
沙发
birdfly324 [专家分:20] 发布于 2005-10-07 09:52:00
说下分治后怎么合并就行
板凳
fuch [专家分:250] 发布于 2005-10-08 21:59:00
用类似归并排序的方法。
3 楼
林木 [专家分:130] 发布于 2005-10-09 12:31:00
合并的时候一个指针指i向左边的元素l,有个指针j指向右边的元素r
当r小于l的时候,左边i到mid中的元素则与r构成逆序对。
只用将总数加上mid-i+1就可以了。
4 楼
birdfly324 [专家分:20] 发布于 2005-10-12 19:41:00
怎么让分的两个数列有序呢?
5 楼
林木 [专家分:130] 发布于 2005-12-04 11:28:00
归并排序的过程啊
6 楼
cdread [专家分:0] 发布于 2005-12-11 14:32:00
#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 楼
standing [专家分:0] 发布于 2005-12-18 17:21:00
#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 楼
pcboyxhy [专家分:2910] 发布于 2006-01-12 08:17:00
现在OI用C/C++了么?
我来回复