求N個元素的逆序數
題目:
求N個元素的逆序數
分析:
解法一:窮舉,時間復雜度為O(n2)
解法二:使用歸并排序計算逆序數,時間復雜度O(N*lngN)
使用分治思想,以mid值將序列分為左序列(left->mid),右序列(mid+1->right)。將左右子序列排序好之后,進行合并。合并時獲得逆序數,因為左序列已經保證有序,當右序列的值小于左序列的值,逆序數 = (midel-li+1)。以此類推。
/**
* 利用歸并排序計算逆序數
* @param v 數字序列
* @param l 左邊界
* @param r 有邊界
* @return 左右邊界之間的逆序數
*/
public static int findRev_order_num(int[] v,int l,int r){
int len = r-l;
if(len==0){
return 0;
}else if(len==1){
if(v[l]>v[r]){
int tmp = v[l];
v[l] = v[r];
v[r] = tmp;
return 1;
}
}else{
int mid = l+len/2;
int leftNum = findRev_order_num(v,l,mid);
int rightNum = findRev_order_num(v,mid+1,r);
int merNum = 0;
int[] dp = new int[r-l+1];
int index=0;
int i=l;
int j=mid+1;
while(i<=mid && j<=r){
if(v[i]>v[j]){
merNum+=mid-i+1;
dp[index++] = v[j];
j++;
}else{
dp[index++] = v[i];
i++;
}
}
while(i<=mid){
dp[index++] = v[i++];
}
while(j<=r){
dp[index++] = v[j++];
}
System.arraycopy(dp,0,v,l,dp.length);
return (leftNum+rightNum+merNum);
}
return 0;
}

浙公網安備 33010602011771號