您的位置:首页 > 其它

用mergesort计算逆序对的算法

2011-05-09 15:08 344 查看
static int inversePairs(int[] A,int left,int right){
if(right<left) return 0 ;
int mid = (left + right)/2;
int inverseCnt = 0;
if(mid>left){
inverseCnt += inversePairs(A,left,mid);
}
if(mid+1<right){
inverseCnt += inversePairs(A,mid+1,right);
}

//merge the two parts
int i1=left;
int i2=mid+1;
int i3=0;;
int[] tmp = new int[right-left+1];
while(i1<=mid && i2<=right){
if(A[i1]>A[i2]){
//inverse found, print out
//inverseCnt += mid - i1 + 1;
for(int i=i1;i<=mid;i++) {
inverseCnt ++;
System.out.println(A[i] +" " + A[i2]);
}

tmp[i3++] = A[i2++];
}else{
tmp[i3++] = A[i1++];
}
}
if(i1<=mid){
for(int i=i1;i<=mid;i++)
tmp[i3++] = A[i];
}else if(i2<=right){
for(int i=i2;i<=right;i++)
tmp[i3++] = A[i];
}
for(int i=0,j=left+i;i<i3;i++,j++){
A[j] = tmp[i];
}

return inverseCnt;
}


例如序列(3,0,4,5,1,2)的逆序对有7个:(3,0), (5,1), (5,2), (3,1), (4,1), (3,2), (4,2)。归并算法时间平均复杂度为O(nlogn), 比简单的算法O(n^2)效率高。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: