時間限制: 300 ms 記憶體限制: 65536 kb
題目鏈結
給定乙個整數序列,求逆序對的個數
輸入
第乙個數為序列長度n
接下來一行,n個整數,保證在int範圍內
輸出
輸出一行,逆序對的個數
輸入樣例
5輸出樣例 資料範圍1≤n≤1055 4 3 2 1
一般思路是對於每乙個資料都向後搜尋比它大的數,但這種方法的時間複雜度是o(n2)
最後我們只需要把每一次求出來的個數相加就能求得逆序對的個數。
#include
#include
#include
#include
#include
long
long
int count=0;
//int不夠存
void
merge
(int x,
int tmp,
int left,
int leftend,
int rightend)
else
while
(i<=leftend)
tmp[q++
]=x[i++];
while
(j<=rightend)
tmp[q++
]=x[j++];
for(i=left; i<=rightend; i++
) x[i]
=tmp[i];}
void
msort
(int k,
int tmp,
int left,
int right)
}void
mergesort
(int k,
int n)
else
printf
("no space for tmp array!!!\n");
}//以上三段是經典的歸併排序,求逆序對的時候僅僅加了一行**而已
intmain()
mergesort
(a,n)
;printf
("%lld"
,count)
;free
(a);
return0;
}
遞迴求逆序對個數
給定輸入n,之後輸入1到n的乙個排列,求排列中的逆序對的個數 思路一 思路二 思路二 實現 include include include using namespace std 歸併,並計算出逆序數的個數 intmerge int a,int s,int mid,int e,int b else ...
分治 求逆序對個數並列印逆序對
如果用最hick的方法去求那麼就是o n 2 的複雜度,如果想優化的話,用歸併排序的方法分治處理。主要思想 總逆序 左邊逆序 右邊逆序 左邊右邊分別排序後的逆序 include includeusing namespace std 用歸併排序的思想來求,歸併排序為o nlogn 的時間複雜度,比暴力...
求逆序對個數(分治)
求逆序對個數 在歸併排序 從大到小 的合併過程前,對兩個分支進行逆序對數的計算 該計算過程為o n include include include define n 100005 using namespace std int a n b n void merge int a,int s,int m...