題目描述:
解析:本題使用歸併排序來求解逆序對數的問題,交換元素的次數正好就等於逆序數的個數。
**:
#include
#include
#include
#include
using std::cin;
using std::cout;
using std::endl;
using std::vector;
using std::string;
void
merge
(vector<
int>
&a,int low,
int high,
int mid,
int& count)
else
temp.
push_back
(a[i++])
;}while
(i <= mid)temp.
push_back
(a[i++])
;while
(j <= high)temp.
push_back
(a[j++])
;for
(auto i =
0; i < temp.
size()
; i++
)a[low + i]
= temp[i];}
void
mergesort
(vector<
int>
&a,int low,
int high,
int&count)
}int
main()
;int count =0;
int low =
0, high = a.
size()
-1;mergesort
(a, low, high, count)
;for
(auto i =
0; i < a.
size()
; i++
)cout << a[i]
<<
" "
; cout << endl;
cout << count << endl;
return0;
}
分治法求解逆序數 歸併排序
題目內容 設a1,a2,an是集合的乙個排列,如果iaj,則序偶 ai,aj 稱為該排列的乙個逆序。例如,2,3,1有兩個逆序 3,1 和 2,1 設計演算法統計給定排列中含有逆序的個數。輸入格式 第一行輸入集合中元素個數n,第二行輸入n個集合元素 輸出格式 含有逆序的個數 輸入樣例 32 3 1 ...
歸併排序 逆序數
對於數列a,將其二分地拆分為b,c 先將b,c分別排序好,再合併b,c即為總的排序,不過在合併的過程中我們可以算出逆序數哦。其原理網上很多,我這裡不再贅述,只給出實現 include include define ll long long using namespace std ll mergeso...
逆序數(歸併排序)
分而治之 分 每次從中間劃分開,直到有序為止,即乙個整數 void merge int s,int left,int right 治重新定義乙個a陣列,儲存排序完的合併陣列,void sort int s,int left,int mid,int right while i mid a k s i ...