逆序對的個數

2021-06-18 12:32:36 字數 632 閱讀 7467

對於陣列a[1...n],若有ia[j],則對偶(i,j)稱為a的乙個逆序對。求陣列中逆序對個數,很簡單的思路是每個數和後面的數比較,這樣需要(n^2)的時間,如果採用歸併排序的思想最壞情況下需要o(nlgn)。

1.分解a[low...mid]和a[mid+1...high]

2.求解

3.合併,陣列a[low...mid]和a[mid+1...high]分別都是有序的,設定兩個指標,i指向mid,j指向high,如果a[i]>a[j],則a[i]>a[mid+1...high],所以逆序對的個數為j-(mid+1)+1,將a[i]放入陣列tmp中,i前移;如果a[i]

#includeusing namespace std;

int mergearry(int arry,int low,int mid,int high)

else

tmp[k++]=arry[j--];

} while(i>=low)

tmp[k++]=arry[i--];

while(j>mid)

tmp[k++]=arry[j--];

for(i=0;i>n;

arry=new int[n];

for(int i=0;i>arry[i];

cout<

逆序對的個數

在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數p。並將p對1000000007取模的結果輸出。即輸出p 100000000 include include include include includeusing names...

陣列的逆序對個數

計算陣列的逆序對個數 如果按照公升序為準,如果陣列已經按照公升序排列,則逆序對個數為0 若陣列是降序排列的,則逆序對個數最多。可以使用歸併排序解決 public void sort int n,int start,int end,int t static void merge int n,int s...

分治 求逆序對個數並列印逆序對

如果用最hick的方法去求那麼就是o n 2 的複雜度,如果想優化的話,用歸併排序的方法分治處理。主要思想 總逆序 左邊逆序 右邊逆序 左邊右邊分別排序後的逆序 include includeusing namespace std 用歸併排序的思想來求,歸併排序為o nlogn 的時間複雜度,比暴力...