异序对定义如上,最近上卜老师的算法课,试着把一些伪代码写的算法用编程语言实现,异序对的寻找可以借助于merge-sort算法,只需要在merge过程中对比左右两部分,并返回异序数的数目即可。
算法简单修改如下:
package test;
public class testmerge{
public static void main(String[] args) {
int[] data = new int[] { 8,9,2,3,5,7};
print(data);
int result= 0;
result=sort(data,0,5);
System.out.println(“排序后的数组:”);
System.out.println(“final result:”+result);
print(data);
}
public static int sort(int[] data, int left, int right) {
int l,r,mid,sum,center;
if (left >= right)
return 0;
// 找出中间索引
center = (left + right) / 2;
// 对左边数组进行递归
l= sort(data, left, center);
// 对右边数组进行递归
r=sort(data, center + 1, right);
// 合并
mid= merge(data, left, center, right);
sum=l+r+mid;
return sum;
}
public static int merge(int [] a,int start,int mid,int end){
int n1=mid-start+1;
int n2=end-mid;
int count=0;
int [] left=new int[n1];
int [] right=new int[n2];
int i,j;
for(i=0;i<n1;i++){
left[i]=a[start+i];
}
for(j=0;j<n2;j++){
right[j]=a[mid+j+1];
}
i=0;j=0;
int k=start;
while(i<n1&&j<n2){
if(left[i]<right[j]){
a[k++]=left[i++];
}
else{
a[k++]=right[j++];
count=count+n1-i;
}
}
while(i<n1){
a[k++]=left[i++];
}
while(j<n2){
a[k++]=right[j++];
}
System.out.println(“count is “+count);
return count;
}
public static void print(int[] data) {
for (int i = 0; i < data.length; i++) {
System.out.print(data[i] + “\t”);
}
System.out.println();
}
}
只需要添加一个返回值并在代码中加入加粗部分即可。代码时间复杂度为O(nlogn)