尋找異序對算法

異序對定義如上,最近上卜老師的算法課,試着把一些僞代碼寫的算法用編程語言實現,異序對的尋找可以藉助於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)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章