用mergesort计算逆序对的算法

  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)效率高。
posted @ 2011-06-05 21:59  ljsspace  阅读(390)  评论(0)    收藏  举报